Инструкции Docker. Создаем Dockerfile

Примечание: Здесь мы рассмотрим основные инструкции, которые используются при создании Dockerfile. Будет минимум нужной информации, которая необходима для остальных статей по теме Docker. Подробная информаци по командам, указана в официальной документации https://docs.docker.com/engine/reference/builder/

Основные Docker-инструкции

  • FROM — задает главный образ (Родительский);
  • LABEL — добавляет метаданные для образа;
  • ENV — задает переменные окружения с именем key и значением value ;
  • RUN —выполняет любые команды и делает коммит результата;
  • COPY  — копирует новые файлы или каталоги из src и добавляет их в файловую систему контейнера в dest;
  • ADD  — делает всё то же, что и инструкция COPY. Но ещё может распаковывать локальные .tar файлы;
  • CMD — может быть использована только один раз в Dockerfile. Если вы используете больше одной CMD, то только последняя инструкция будет работать.;
  • WORKDIR — устанавливает рабочую директорию для инструкции CMD и ENTRYPOINT;
  • ARG — определяет переменную для передачи Docker’у во время сборки;
  • ENTRYPOINT — предоставляет команды и аргументы для выполняющегося контейнера. Суть его несколько отличается от CMD, о чём мы поговорим ниже;
  • EXPOSE — открывает порт;
  • VOLUME — создаёт точку подключения директории для добавления и хранения постоянных данных.

FROM

FROM <image>

или

FROM <image>:<tag>

или

FROM <image>@<digest>

Инструкция FROM задает базовый образ для последующих инструкций. Dockerfile обязательно должен иметь инструкцию FROM. Можно использовать любой работающий образ, проще всего начать с загрузки образа из публичного репозитория.

  • FROM должен быть первой инструкцией в Dockerfile (не считая комментариев и директив парсера).
  • FROM может использоваться несколько раз в пределах одного Dockerfile для создания нескольких образов. Просто отслеживайте последний ID образа перед каждой новой командой FROM.
  • Значения tag или digest не обязательны. Если любая из этих опций не задана Докер по умолчанию использует значение latest. Сборщик Docker возвращает ошибку если значение tag не найдено.

LABEL

LABEL <key>=<value><key>=<value><key>=<value> ...

Инструкция LABEL добавляет метаданные для образа. LABEL состоит из пар key=value. Для использования пробелов в значениях LABEL, используйте кавычки и обратный слеш как если бы вы находились в командной строке. Несколько примеров:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

ENV

ENV <key><value>
ENV <key>=<value> ...

Инструкция ENV задает переменные окружения с именем key и значением value. Это значение будет находиться в окружении всех команд потомков Dockerfile и могут быть использованы как обычные переменные окружения.

Инструкция ENV имеет две формы. Первая форма, ENV key value, устанавливает значение одной переменной. Вся строка после первого пробела будет рассматриваться как value - включая пробелы и кавычки.

Вторая форма, ENV key=value ..., позволяет задать сразу несколько переменных. Обратите внимание что вторая форма использует в синтаксисе знак равенства (=), в то время как для первой формы это не нужно. Как и в случае разбора командной строки, ковычки и обратные слеши могут быть использованы для включения пробелов в значениях.

Пример:

ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy

и

ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy

Оба примера приведут к одному результату в контейнере, но первый вариант предпочтительней, поскольку он создаст только один слой.


RUN

RUN имеет две формы:

  • RUN command (shell форма, команда выполняется в шеле, по умолчанию /bin/sh -c для Linux или cmd /S /C для Windows)
  • RUN ["executable", "param1", "param2"] (exec форма)

Инструкция RUN выполняет любые команды в новом слое поверх текущего образа и делает коммит результата. Полученный после коммита образ будет использован для следующего шага в Dockerfile.

Создание слоев инструкцией RUN и последующий их коммит является базовой концепцией Docker, которая позволяет создать контейнер из любой точки истории образа, по аналогии с системами контроля версий.

exec форма выполнения команд позволяет разбивать строку команды и выполнять команды используя базовый образ который не имеет исполняемого файла оболочки.

Для shell формы оболочка по-умолчанию может быть изменена с помощью команды SHELL.

В shell форме вы можете использовать \ (обратный слеш) в инструкциях RUN для переноса команды на следующую строку. К примеру рассмотрим две следующих строки:

RUN /bin/bash -c 'source $HOME/.bashrc ;\
echo $HOME'

Вместе они эквивалентны строке:

RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'

COPY

COPY имеет две формы:

  • COPY src ... dest
  • COPY ["src",... "dest"] (эта форма используется для путей с пробелами)

Инструкция COPY копирует новые файлы или каталоги из src и добавляет их в файловую систему контейнера в dest.

COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

dest абсолютный, или относительный путь для WORKDIR, куда будет произведено копирование в файловую систему контейнера.

COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/

Все файлы и папки создаются с UID и GID равными 0.

  • Если src является файлом любого типа, он копируется вместе с метаданными. В случае, если dest заканчивается косой чертой (/), он будет считаться каталогом и содержимое src будет записано в dest/base(src).
  • Если задано несколько src ресурсов, или задан шаблон, то dest должен быть каталогом и заканчиваться косой чертой (/).
  • Если dest не заканчивается слешем, он будет рассматриваться как обычный файл и содержимое src будет записано dest.
  • Если dest не существует, то он будет создан со всеми недостающими каталогами.

ADD

ADD имеет две формы:

  • ADD src... dest
  • ADD ["src",... "dest"] (эта форма обязательна для путей с пробелами)

Инструкция ADD копирует новые файлы, папки или или удаленные файлы по URLs из src и добавляет их в файловую систему контейнера в dest.

Возможно множественное задание src, но пути к файлам и папкам должны быть относительными для контекста сборки (папки с Dockerfile).

ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

dest абсолютный, или относительный путь для WORKDIR, куда будет произведено копирование в файловую систему контейнера.

ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # adds "test" to /absoluteDir/

Все файлы и папки создаются с UID и GID равными 0.

  • Если src является файлом любого типа, он копируется вместе с метаданными. В случае, если dest заканчивается косой чертой (/), он будет считаться каталогом и содержимое src будет записано в dest/base(src).
  • Если задано несколько src ресурсов, или задан шаблон, то dest должен быть каталогом и заканчиваться косой чертой (/).
  • Если dest не заканчивается слешем, он будет рассматриваться как обычный файл и содержимое src будет записано dest.
  • Если dest не существует, то он будет создан со всеми недостающими каталогами.

CMD 

Инструкция CMD имеет три формы:

  • CMD ["executable","param1","param2"] (exec форма, является предпочтительной)
  • CMD ["param1","param2"] (в качестве параметров по умолчанию для ENTRYPOINT)
  • CMD command param1 param2 (shell форма)

Инструкция CMD может быть использована только один раз в Dockerfile. Если вы используете больше одной CMD, то только последняя инструкция будет работать.


WORKDIR

WORKDIR /path/to/workdir

Инструкция WORKDIR устанавливает рабочий каталог для всех инструкций RUN, CMD, ENTRYPOINT, COPY и ADD которые будут выполнены в Dockerfile. Если WORKDIR не задана, то она будет создана даже если в Dockerfile нет ни одной инструкции для которой это необходимо.

Инструкция может быть использована несколько раз в одном Dockerfile. Если указывается относительный путь, он будет определен относительно предыдущего значения WORKDIR. К примеру:

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

В результате команда pwd из Dockerfile вернет значение /a/b/c.

Инструкция WORKDIR может использовать переменные окружения заданные через ENV. Вы можете использовать переменные окружения явно заданные в Dockerfile. К примеру:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

В результате команда pwd в этом Dockerfile вернет /path/$DIRNAME


ARG

ARG <name>[=<default value>]

Инструкция ARG задает переменные которые пользователь передает сборщику образа docker build с помощью флага --build-arg varname=value. Если пользователь указывает аргумент сборки, который не был определен в Dockerfile, сборка выдает ошибку.

One or more build-args were not consumed, failing build.

ENTRYPOINT

ENTRYPOINT имеет две формы:

  • ENTRYPOINT ["executable", "param1", "param2"] (exec форма, предпочтительная)
  • ENTRYPOINT command param1 param2 (shell форма)

Инструкция ENTRYPOINT позволяет настроить контейнер так что бы он работал как исполняемый файл.

К примеру, следующая команда запустит nginx с прослушиванием 80 порта:

docker run -i -t --rm -p 80:80 nginx

EXPOSE

EXPOSE <port> [<port>...]

Инструкция EXPOSE указывает Docker что контейнер слушает определенные порты после запуска. EXPOSE не делает порты контейнера доступными для хоста. Для этого, вы должны использовать флаг -p (что бы открыть диапазон портов) или флаг -P что бы открыть все порты из EXPOSE. Можно задать один номер порта и пробросить его на другой внешний порт.

Для настройки перенаправления портов на хосте читайте использование флага -P. Docker поддерживает создание сетей без необходимости открытия портов, для более подробного ознакомления читайте обзор данной функции.


VOLUME

VOLUME ["/data"]

Инструкция VOLUME создает точку монтирования с заданным именем и помечает его как внешний смонтированный том из базового хоста или контейнера. Можно использовать JSON массив, VOLUME ["/var/log/"], или текстовую строку с несколькими аргументами, например VOLUME /var/log или VOLUME /var/log /var/db. Для большей информации/примеров и инструкций монтирования в Docker, читайте документацию расшаривание каталогов через тома данных.

Команда docker run инициализирует новый том с любыми данными которые существуют в указанном месте в пределах базового образа. К примеру, рассмотрим следующий фрагмент кода из Dockerfile:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

В результате запуска образа собранного из данного Dockerfile командой docker run, будет создана новая точка монтирования /myvol и в ней будет создан файл greeting.

Примечание: Если в процессе каких либо шагов сборки будут изменены данные после объявления тома, то эти изменения будут потеряны.

Примечание: Список обрабатывается как JSON массив, что подразумевает обязательное заключение слов в двойные кавычки (") и ни в коем случае одинарные (').

Оцените статью: