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