2022-07-02
691

Создание образа с помощью dockerfile

Dockerfile - это файл, в котором указываются действия для сборки образа.

Сборка образа на основе dockerfile осуществляется командой
docker build -t <image-name> </dir/source>
Сборка образа на основе dockerfile, если dockerfile в текущем каталоге
docker build -t <image-name> .

Синтаксис dockerfile

Комментарии обозначаются знаком #, он должен стоять вначале строки иначе рассматривается как аргумент.

Инструкции пишутся в формате
INSTRUCTION arguments
в инструкции не учитывается регистр символов. Однако они должны быть написаны заглавными буквами, чтобы было легче отличать их от аргументов.

Dockerfile должен начинаться с инструкции FROM.

FROM

Указывает родительский образ, то есть на основе какого образа будет построен текущий, например
FROM ubuntu:20.04
или
FROM python:3
После двоеточия указывается тег, его можно не писать, тогда будет взята последняя версия образа.

LABEL

Добавляет метаданные для образа, например информацию об авторе в виде ключ=значение. Можно указать несколько меток, но каждый ключ должен быть уникальным
LABEL maintainer="alnotes@alnotes.ru"

ARG

Определяет переменную для передачи образу во время сборки. Можно указать значение по умолчанию. ARG переменные, в отличае от ENV переменных, не доступны для запущенных контейнеров. ARG переменные можно использовать, например для установки дефолтных значений ENV переменных при создании образа
ARG arg_var1=default_value
ARG arg_var1=default_value
ENV env_var1=$arg_var1
переопределить значение при создании образа
docker build --build-arg var1=value

RUN

Запускает команды при формировании образа, создаёт слой образа. Чаще всего используется для установки пакетов и библиотек внутрь образа
RUN yum install httpd
RUN apt update
RUN mkdir -p /usr/src/app
каждый запуск RUN в dockerfile забирает слой, поэтому простые команды лучше запускать одним уровнем, например
RUN apt update && apt install -y squid3

COPY и ADD

Копирует файлы и каталоги в контейнер, кроме того ADD может скачивать файлы по url и разархивировать. Создают нужные каталоги в образе. Предпочтительнее использовать COPY, где это возможно
ADD ./script.py /usr/src/app

EXPOSE

Порты, на которых контейнер прослушивает соединения. Для открытия порта при запуске контейнера используется ключ -p 9999:3128
EXPOSE 3128

ENV

Создаёт или меняет переменную окружения, которая будет доступна внутри контейнера
Изменение временной зоны
ENV TZ Europe/Moscow
Добавление пути в переменную PATH
ENV PATH=/usr/local/nginx/bin:$PATH

WORKDIR

Устанавливает текущий каталог для инструкций COPY, ADD, RUN, CMD и ENTRYPOINT, которые идут после WORKDIR. Автоматически создаёт каталог, если его ещё нет. Может использоваться несколько раз
WORKDIR /usr/src/app

VOLUME

Создаёт точку монтирования для добавления и хранения постоянных данных
RUN mkdir /vol
VOLUME /vol

USER

Задает имя пользователя и, при необходимости группу, для использования при запуске образа и для инструкций RUN, CMD, ENTRYPOINT, которые следуют после USER
USER <user-name>:<group-name>

CMD

Указывает команду и аргументы для выполнения внутри контейнера. Может быть только одна на весь dockerfile. Обычно используется для запуска программ. При запуске контейнера с аргументами командной строки, аргументы CMD переопределяются.
CMD echo '1234'
CMD squid3 -N
CMD ["python", "app.py"] запуск скрипта, где вторым аргументом является имя файла скрипта
CMD ["bash"] запуск оболочки bash

ENTRYPOINT

Указывает команду и аргументы для выполнения внутри контейнера. Может быть использован вместе с CMD. Отличается от CMD тем, что при запуске контейнера с аргументами командной строки, в ENTRYPOINT они не переопределяются, вместо этого аргументы добавляются к аргументам ENTRYPOINT.
ENTRYPOINT ["python", "app.py"]

Примеры dockerfile

Пример 1
Самый простой пример, при запуске выведет 1234
FROM ubuntu
CMD echo '1234'
Пример 2
# За основу взят образ debian версии jessie
FROM debian:jessie
# Автор
LABEL maintainer="alnotes@alnotes.ru"
# Обновление пакетов
RUN apt update && apt install -y
# Установка приложения
RUN apt install -y squid3
# Прослушиваемый порт
EXPOSE 3128
# Что выполнять, при запуске контейнера
CMD squid3 -N
Пример 3
# За основу взят образ python версии 3.6
FROM python:3.6
# Создание каталога и переход в него 
WORKDIR /usr/src/app
# Копирование файлов в образ
COPY . /usr/src/app
# Изменение переменной окружения часового пояса
ENV TZ Europe/Moscow
# Выполнение python-скрипта при запуске контейнера
CMD ["python", "app.py"]