Главная | Обо мне

Написание Dockerfile

В этой стать я не буде касаться темы сборки образа Docker. Поговорим только о Dockerfile.

Структура

Dockerfile состоит из команд, одна команда - одна строка. Если по какой то причине команда получилась слишком длинной, то можно растянуть её на несколько строк поставив \ в конец, "продлеваемой", строки. Так же с помощью # можно сделать комментарий.

Важно понимать что каждая команда создаёт новый слой в образе. Эти слои хранятся в кэше и используются при повторной сборке образа.

Вот пример:

FROM python:3-alpine

# Комментарий.
# Ещё один комментарий.

WORKDIR /app

COPY ./ ./

VOLUME /data

CMD [ "python", "./main.py" ]

Команды

Здесь описаны только основные команды, но думаю что их будет достаточно для первоначального понимания.

FROM

У каждого образа Docker должен быть образ "предок". Почти для всех популярных языков программирования такой образ можно найти на Docker Hub. Вот несколько примеров:

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