Примечание: Здесь мы рассмотрим основные инструкции, которые используются при создании 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 массив, что подразумевает обязательное заключение слов в двойные кавычки (") и ни в коем случае одинарные (').