Введение
Помимо директивы 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.
см. также:
- 🎢 Что такое Dockerfile и как создать образ Docker?
- 🐳 Как проверить оставшееся дисковое пространство в файловой системе Docker Overlay
- 🐳 Сравнение команд Docker Exec и Docker Attach
- 🐳 Размер образа Docker: как проверить и уменьшить