Dockerfile — конфигурационный файл, который содержит инструкции, которые будут применены при сборке Docker-образа и запуске контейнера. Dockerfile создается в корневой директории проекта и не имеет расширения.
Синтаксис Dockerfile похож на синтаксис конфигурационных файлов .ini. На каждую строчку приходится одна инструкция. Инструкции пишутся капсом, а их значения отделяются пробелом.
Пример Dockerfile:
FROM alpine
RUN apk add --no-cache nginx && mkdir -p /run/nginx
WORKDIR /etc/nginx/
COPY custom.conf /etc/nginx/conf.d
EXPOSE 80
COPY . /opt/
CMD ["nginx","-g","daemon off;"]
Dockerfile имеет следующую логику заполнения:
FROM - инструкция, которая всегда идёт первой и указывает родительского образа. Например, FROM alpine.
RUN - инструкция, которая может принимать конвейер команд Linux, чтобы не создавать лишние слои. Например, RUN apt-get update && apt-get install nginx.
WORKDIR - инструкция, которая устанавливает рабочий каталог контейнера. Например, WORKDIR /etc/nginx/. Последующие команды RUN, CMD, ENTRYPOINT наследуют привязку WORKDIR.
CMD - завершающая инструкция, которая отвечает за запуск контейнера. Например, CMD ["nginx","-g", "daemon off;"]. CMD наследует привязку к WORKDIR.
Таблица инструкций Dockerfile с примерами:
| Инструкция | Описание | Пример | Комментарий | 
| FROM | Задает родительский образ. Все последующие инструкции создают слои поверх родительского образа. | FROM nginx:latest | Со списком образов можно ознакомиться на Docker hub. | 
| RUN | Выполняет команду внутри контейнера c сохранением результата. | RUN mkdir /etc/nginx/ | RUN может исполнять команды с логическими операторами && и ||. | 
| COPY | Копирует файлы и папки из текущей директории, где находится Dockerfile в указанную директорию в контейнере | COPY . /etc/nginx/ | COPY считывает позицию Dockerfile на хосте, поэтому первым аргументом идет «.». | 
| ADD | Копирует файлы и папки из текущей позиции Dockerfile, скачивает файлы по URL и работает с tar-архивами. | ADD https://mhost.by/archive/demo_config.ini /etc/nginx/ | Официальная документация не рекомендует применять ADD. | 
| ENV | ENV задает переменные среды внутри образа. | ENV ADMIN="nginx" | ENV часто применяют для передачи в контейнеризированное приложение переменные среды. | 
| ARG | Переменные, которые передается докером во время сборки образа. | ARG maintainer=nginx | В отличие от ENV-переменных, ARG-переменные недоступны во время выполнения\работы контейнера. | 
| WORKDIR | Устанавливает рабочую директорию контейнера. | WORKDIR /etc/nginx/ | Последующие инструкции CMD, RUN, ENTRYPOINT наследуют привязку к директории установленной в WORKDIR. | 
| VOLUME | Создает и подключает постоянный том хранения данных. | VOLUME /data_1 | Просмотреть существующие тома можно командой docker volume ls. К контейнеру можно подключить существующий том, для этого достаточно указать уже существующий том. | 
| EXPOSE | Указывает локальный порт контейнера. Инструкция сама по себе не открывает порт. | EXPOSE 80 | Если требуется пробросить и сопоставить разные порты внутри и снаружи контейнера используется docker run -p внутренний порт:внешний порт | 
| LABEL | Добавляет метаданные в образ. | LABEL maintainer="nginx_test" | Обычно LABEL содержит информацию об авторе образа. | 
| CMD | Выполняет команду с указанными аргументами во время запуска контейнера. | CMD ["nginx","-g","daemon off;"] | CMD должна быть одна в конце Dockerfile. CMD может вызывать исполняемый файл — .sh | 
| ENTRYPOINT | Похожа на CMD, но при запуске контейнера не переопределяется в отличие от CMD. | ENTRYPOINT ["nginx","-g","daemon off;"] | ENTRYPOINT может использоваться совместно с CMD. |