Что такое Dockerfile и как его использовать
Каждому образу Docker соответствует файл, который называется Dockerfile. Его имя записывается именно так — без расширения. При запуске команды docker build для создания нового образа подразумевается, что Dockerfile находится в текущей рабочей директории. Если этот файл находится в каком-то другом месте, его расположение можно указать с использованием флага -f. Создадим простой Dockerfile:
FROM ubuntu:20.04 RUN apt-get update && apt-get install -y wget curl nano WORKDIR /root/docker COPY myfile myfile
И создадим новый образ с именем и тегом custom_ubuntu:1
build -t custom_ubuntu:1 .
Dockerfile все открывается инструкцией FROM с указанием родительского образа.
Далее зачастую пишутся команды RUN, поскольку каждая инструкция RUN создает новый слой. Хорошей практикой считается писать конвейеры логически связанных команд в одной инструкции RUN. Например, мы поместили команды обновления пакетов apt, установку нескольких утилит в одну инструкцию. Для комбинирования команд используется логический оператор «И», обозначающийся как &&.
Инструкция WORKDIR устанавливает рабочую директорию контейнера. Все последующие команды, работающие с привязками к директории, такие как COPY, RUN, CMD, ENTRYPOINT будут выполняться исходя из установленной директории. Например, в команде COPY, нашего примера, второй аргумент в действительности выглядит так
COPY myfile /root/docker/myfile
Проверим создался новый образ или нет командой docker images:
REPOSITORY TAG IMAGE ID CREATED SIZE custom_ubuntu 1 af08e52086b9 4 minutes ago 72.8MB
Запустим образ и проверим отработала ли WORKDIR из Dockerfile, да как видим pwd выдало правильный путь
docker run --rm -it custom_ubuntu:1 root@3cc16903b955:~/docker# pwd /root/docker
docker history custom_ubuntu:1 позволяет увидеть что происходило при сборке вашего образа.
Таблица инструкций Dockerfile с примерами команд и опций
Зачем нужен Entrypoint?
Используйте ENTRYPOINT, если вы не хотите, чтобы пользователь вашего образа изменял исполняемый файл, который запускается при запуске контейнера. Используйте CMD, если записываете команду (исполняемый файл) по умолчанию, которую пользователь с лёгкостью может переопределить на этапе запуска контейнера. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг –entrypoint. Подробнее в официальной документации Понимание взаимодействия CMD и ENTRYPOINT.
Инструкция | Описание | Пример использования | Комментарий |
---|---|---|---|
FROM | Задает базовый образ. Все последующие инструкции создают слои поверх родительского образа. | FROM python:latest FROM debian:wheezy | Быстрее всего можно найти образ с нужным тегом на Docker hub. |
RUN | Выполняет команду внутри контейнера и сохраняет результат. | RUN mkdir /usr/src/app/ RUN apt-get update && apt-get install python3-pip -y" | RUN может исполнять конвейер команд с логическими операторами && || |
COPY | Копирует файлы и папки из текущей директории, где находится пользователь в указанную директорию в контейнере. Если файл нужно скачать по ссылке или распаковать архив используйте ADD. | COPY . /usr/src/app/ | COPY считывает позицию пользователя на хосте, поэтому первым аргументом идет «.». |
ADD | Копирует файлы и папки из текущей позиции пользователя, скачивает файлы по URL и работает с tar-архивами." | ADD https://wiki.dieg.info/_media/winmtr.zip /usr/src/app/ | Официальная документация не рекомендует применять ADD. Для скачивания по URL можно использовать RUN с CURL или WGET, а для копирования — COPY. |
CMD | Выполняет команду с указанными аргументами во время запуска контейнера. | CMD ["python","web_interface.py"] | CMD должна быть одна в конце Dockerfile. CMD может вызывать исполняемый файл — .sh Аргументы docker run переопределяют CMD. Базовое поведение CMD дополнять инструкцию ENTRYPOINT. CMD всегда пишется после ENTRYPOINT. |
ENTRYPOINT | Похожа на CMD. Инструкции ENTRYPOINT и CMD могут быть переопределены с помощью флагов командной строки. | ENTRYPOINT ["python", "web_interface.py"] | ENTRYPOINT может использоваться совместно с CMD. |
ENV | Задает переменные среды внутри образа, на которые могут ссылаться другие инструкции. | ENV ADMIN="darkfire" Также можно передать переменную окружения TOKEN при запуске контейнера, используя ключ e docker run --rm -it -e TOKEN=abc ubuntu/entry или ключ –env-file - записывает в переменные окружения все данные из файла | ENV часто применяется для передачи информации в контейнеризированное приложение через переменные среды. |
ARG | Задает переменные, значение которых передается докером во время сборки образа. | ARG maintainer=darkfire
| В отличие от ENV-переменных, ARG-переменные недоступны во время выполнения контейнера. |
WORKDIR | Устанавливает рабочую директорию внутри контейнера. | WORKDIR /usr/src/app/ | Последующие инструкции CMD, RUN, ENTRYPOINT наследуют привязку к директории установленной WORKDIR. |
VOLUME | Создает и подключает постоянный том хранения данных. | VOLUME /data_cont_1
| Просмотреть существующие тома можно командой docker volume ls. К контейнеру можно подключить существующий том, для этого достаточно указать уже существующий том. |
EXPOSE | Инструкция, которая позволяет сообщить пользователю, какой(ие) порт(ы) слушает приложение внутри контейнера. Инструкция сама по себе не прокидывает порты на хост. Чтобы использовался указанный в EXPOSE порт — нужно указать docker run -P при запуске контейнера. | EXPOSE 5000
| Если требуется пробросить и сопоставить разные порты внутри и снаружи контейнера используется docker run -p порт на хосте: порт в контейнере docker run -d -p 81:80 --name httpd-container httpd Эта команда запускает Docker-контейнер httpd (HTTP-сервер Apache) и маппинг 81 порта хоста с 80 портом внутри Docker-контейнера. Подробнее в статье Проброс портов или маппинг портов |
LABEL | Добавляет метаданные в образ. | LABEL maintainer="darkfire" | Обычно LABEL содержит информацию об авторе образа. |


