🐳 Копирование папок в образ Docker с помощью Dockerfile ADD

Как скопировать каталог в образ

by itisgood

Введение

Помимо директивы COPY, мы можем использовать ADD при создании Dockerfile для переноса папок с локальной машины на образ Docker.

Эта команда также может работать по-разному, включая автоматическое извлечение локальных сжатых файлов и загрузку файлов из удаленных источников в образ Docker.

Однако в этой статье мы сосредоточимся на использовании директивы ADD для копирования папок в образ Docker.

 Как работает директива ADD в Dockerfile?

По сути, чтобы скопировать папки с хоста в образ Docker, нам нужно указать путь к папке в качестве источника и путь назначения в Dockerfile.

Давайте рассмотрим основной синтаксис директивы ADD:

ADD <src> <dest>
  • <src>: указывает путь к исходному файлу или каталогу, который необходимо передать. Это может быть относительный путь, абсолютный путь или URL.
  • <dest>: указывает путь назначения в файловой системе образа Docker, куда перемещается файл или каталог.

Понимание этого синтаксиса помогает не только успешно копировать файлы, но и легко организовывать файлы и каталоги в нашем образе Docker.

Копирование папки в образ Docker с помощью Dockerfile ADD

Как правило, чтобы эффективно скопировать локальную папку в образ Docker, нам нужно убедиться, что папка находится в той же директории, что и Dockerfile.

Это связано с тем, что команда docker build выполняется там, где находится Dockerfile, поскольку Docker использует его в качестве контекста сборки.

Давайте покажем пример того, как должно выглядеть простое дерево файлов:

package/
├── Nginx-App/
│   ├── Dedicated-to-Amara.txt
│   ├── index.html
├── Dockerfile

Из этого примера видно, что package – это родительский каталог, а папка Nginx-App и Dockerfile – объекты в нем.

Кроме того, хранение папки в том же каталоге, что и Dockerfile, обеспечивает более легкую работу.

Это связано с тем, что мы можем ссылаться на всю папку через относительный путь при использовании директивы Dockerfile ADD.

Теперь давайте отредактируем наш Dockerfile:

$ nano Dockerfile

Далее скопируем нашу папку в образ Docker с помощью Dockerfile:

# Base Image
FROM nginx:alpine

# Adds the Nginx-App directory to the NGINX document root
ADD Nginx-App/ /usr/share/nginx/html/Nginx-App

# Exposes port 80
EXPOSE 80

# Starts Nginx
CMD ["nginx", "-g", "daemon off;"]

По сути, директива ADD, используемая в строке 2, копирует папку Nginx-App из родительского каталога в /usr/share/nginx/html/ в образе Docker.

Теперь запустим команду docker build с родительским каталогом:

$ docker build -t nginx-image .

Эта команда указывает Docker на сборку образа с помощью инструкций, содержащихся в файле.

После завершения процесса мы выполняем следующую команду для проверки:

$ docker images                
REPOSITORY                 TAG       IMAGE ID       CREATED              SIZE
nginx-image                latest    40b1d9d4a8a5   About a minute ago   43.2MB

Судя по выводу команды, мы успешно создали образ.

Теперь давайте проверим, что папка находится в образе:

$ docker run -it --rm nginx-image /bin/ash

Эта команда запускает новый контейнер из образа nginx-image и открывает внутри него оболочку ash.

Кроме того, обратите внимание, что оболочка ash здесь уместна, поскольку используемый образ основан на дистрибутиве Alpine Linux.

Далее мы проверяем наличие папки:

$ docker run -it --rm nginx-image /bin/ash
/ # cd /usr/share/nginx/html/Nginx-App
/usr/share/nginx/html/Nginx-App # ls
Dedicated-to-Amara.txt  index.html 

Очевидно, папка и все ее содержимое были скопированы в образ Docker.

4. Копирование сжатой папки

Мы также можем скопировать локальную сжатую папку в образ Docker, используя ту же логику.

Для таких типов файлов ADD автоматически извлекает их содержимое в указанное место назначения в образе.

Это автоматическое извлечение ускоряет и упрощает процесс.

Например, давайте скопируем папку tar в образ Docker:

# Base Image
FROM nginx:alpine

# Adds the compressed Nginx-App folder to the NGINX document root
ADD Nginx-App.tar.gz /usr/share/nginx/html/Nginx-App/

# Exposes port 80
EXPOSE 80

# Starts Nginx
CMD ["nginx", "-g", "daemon off;"]

Затем выполните команду build image:

$ docker build -t nginx-image .           
Sending build context to Docker daemon  5.632kB
Step 1/4 : FROM nginx:alpine
 ---> 1ae23480369f
Step 2/4 : ADD Nginx-App.tar.gz /usr/share/nginx/html/Nginx-App/
...
Successfully built c6f60de9c196

Очевидно, что мы успешно добавили папку tar в образ Docker.

Мы можем убедиться в этом, используя тот же метод, что и выше.

5. Заключение

В этой статье мы рассмотрели все методы использования директивы ADD для копирования папок в наш образ.

Эти методы эффективны и просты в использовании.

Однако их следует использовать с осторожностью, особенно при копировании сжатых папок в образ.

Это связано с тем, что команда ADD автоматически расширяет сжатые форматы и может внести нежелательные файлы в среду Docker.

см. также:

Loading

You may also like

Leave a Comment