Что такое Dockerfile и как его использовать

Docker может автоматически создавать образы, читая инструкции из файла Dockerfile. Dockerfile — это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа. Его имя записывается именно так — без расширения.

На этой странице описаны команды, которые вы можете использовать в 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

docker 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 reference.

ИнструкцияОписаниеПример использованияКомментарий
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
maintainer="darkfire@dieg.info"
Обычно содержит информацию об авторе образа

Зачем нужен Entrypoint?

Используйте ENTRYPOINT, если вы не хотите, чтобы пользователь вашего образа изменял исполняемый файл, который запускается при запуске контейнера. Используйте CMD, если записываете команду (исполняемый файл) по умолчанию, которую пользователь с лёгкостью может переопределить на этапе запуска контейнера. Если точка входа определена, исполняемый файл все равно можно переопределить, используя флаг –entrypoint. Подробнее в официальной документации Понимание взаимодействия CMD и ENTRYPOINT.

LABEL добавляет метаданные в образ и обычно содержит информацию об авторе образа.

LABEL maintainer="darkfire@dieg.info"

Заходишь на хост где запущены контейнеры и этот радует, что хотя бы это получилось=) Задача нужно посмотреть как контейнер собирался то есть нужен Dockerfile. Пробуем искать по всему жесткому диску:

find / -name Dockerfile
PQ VPS сервера в 28+ странах.