Написание Dockerfile
В этой стать я не буде касаться темы сборки образа Docker. Поговорим только о Dockerfile
.
Структура
Dockerfile
состоит из команд, одна команда - одна строка. Если по какой то причине команда получилась слишком длинной, то можно растянуть её на несколько строк поставив \
в конец, "продлеваемой", строки. Так же с помощью #
можно сделать комментарий.
Важно понимать что каждая команда создаёт новый слой в образе. Эти слои хранятся в кэше и используются при повторной сборке образа.
Вот пример:
FROM python:3-alpine
# Комментарий.
# Ещё один комментарий.
WORKDIR /app
COPY ./ ./
VOLUME /data
CMD [ "python", "./main.py" ]
Команды
Здесь описаны только основные команды, но думаю что их будет достаточно для первоначального понимания.
FROM
У каждого образа Docker должен быть образ "предок". Почти для всех популярных языков программирования такой образ можно найти на Docker Hub. Вот несколько примеров:
- Python 3:
FROM python:latest
- Node JS:
FROM node:latest
- OpenJDK 11:
FROM openjdk:11
WORKDIR
Указывает на рабочую директорию ($PWD
). Можно обойтись и без него, но лучше задать что бы везде не прописывать один и тот же путь.
# Теперь все команды внутри Docker контейнера
# будут выполняться в этой директории
WORKDIR /app
ENV
Позволяет установить переменную среду внутри Docker.
# Не храните в этих переменных ничего важного:
# - пароли от БД
# - API ключи
# - и так далее
ENV IS_DOCKER="true"
ENV APP_DATA_DIR="/data"
ENV LOG_LEVEL="err"
RUN echo $APP_DATA_DIR
COPY
Копирует файл внутрь образа.
# Получится так:
# /app/main.py
# /app/LICENSE.txt
WORKDIR /app
COPY ./main.py ./
COPY ./LICENSE ./LICENSE.txt
RUN
Выполняет команду во время сборки образа.
# Вот так команду можно разбить на несколько строк
RUN apt-get update -y && \
apt-get upgrade -y && \
apt-get install -y make gcc
# Ещё одна команда
RUN chmod 755 /usr/local/bin/myprg
CMD
и ENTRYPOINT
Эти команды делают примерно одно и тоже - указывают как запускать контейнер. Но команда ENTRYPOINT
выполняется всегда, а команда CMD
может быть перезаписана с помощью аргументов командной строки при запуске контейнера Docker.
ENTRYPOINT ["/bin/ping"]
CMD ["localhost"]
# В итоги контейнер запустит /bin/ping localhost
EXPOSE
Эта команда маркирует порт который можно "пробросить" наружу. При этом даже если порт не был объявлен командной EXPOSE
его всё равно можно открыть.
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 2323/udp
EXPOSE 22
VOLUME
Работает по такой же логике как команда EXPOSE
. Только теперь объявляются директории, которые можно "пробросить" на хост.
VOLUME /data
VOLUME /usr/share/www/html
LABEL
Позволяет добавить любые метаданные к образу.
# Данные могут быть абсолютно любыми
LABEL org.example.vendor="ACME Incorporated"
LABEL org.example.label-with-value="foo"
Ссылки
Дата создания: 08.03.2022
Дата обновления: 19.03.2022