Docker может автоматически создавать образы, читая инструкции из файла Dockerfile. Dockerfile — это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа
Инструкция FROM
Каждая инструкция пишет большими буквами : FROM , RUN , COPY ...
Docker файл может содержать только одну инструкцию FROM ( FROM ubuntu )
Инструкция FROM является обязательной
Инструкция RUN
Пример RUN apt-get update
Инструкции COPY и ADD
Нужны для добавления файлов и папок внутрь собираемого образа
Пример COPY docker-entrypoint.sh /docker-entrypoint.sh
в примере инструкция COPY копирует файл docker-entrypoint.sh из билд контекста в корень файловой системы собирающегося образа
При копировании можно сразу указывать владельцев для папок и файлов в папке назначения
COPY [--chown=<user>:<group>] <src> ... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
Если папка назначения заканчивается слешом dstFolder/ , то папка создается и внутрь нее копируется содержимое источника
COPY --chown=www-data:www-data src/html, /var/www/html/
Инструкции ENTRYPOINT и CMD
Обе инструкции определяют какая команда выполнится при запуске контейнера.
ENTRYPOINT ["ping"]
CMD ["8.8.8.8"]
Рекомендации :
Инструкция WORKDIR
WORKDIR /path/to/workdir
Инструкция WORKDIR
устанавливает рабочий каталог для любых инструкций RUN
, CMD
, и ENTRYPOINT
, которые следуют за ней в Dockerfile. Если файл не существует, он будет создан, даже если не будет использоваться ни в одной последующей инструкции Dockerfile. COPY
ADD
WORKDIR
Инструкцию WORKDIR
можно использовать несколько раз в Dockerfile. Если указан относительный путь, он будет относиться к пути предыдущей WORKDIR
инструкции. Например:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
Результатом последней pwd
команды в этом Dockerfile будет /a/b/c
.
Инструкция USER
USER <user>[:<group>]
или
USER UID[:GID]
Инструкция USER
устанавливает имя пользователя (или UID) и, при необходимости, группу пользователей (или GID), которые будут использоваться в качестве пользователя и группы по умолчанию до конца текущего этапа. Указанный пользователь используется для RUN
инструкций и во время выполнения запускает соответствующие ENTRYPOINT
команды CMD
.
Обратите внимание, что при указании группы для пользователя пользователь будет иметь только указанное членство в группе. Любое другое настроенное членство в группах будет игнорироваться.
Предупреждение
Если у пользователя нет основной группы, образ (или следующие инструкции) будет выполняться вместе с
root
группой.В Windows сначала необходимо создать пользователя, если это не встроенная учетная запись. Это можно сделать с помощью
net user
команды, вызываемой как часть Dockerfile.
FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick
Инструкция Label
Инструкция LABEL
добавляет метаданные к изображению. A LABEL
— пара ключ-значение. Чтобы включить пробелы в 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."
Инструкция EXPOSE
EXPOSE <port> [<port>/<protocol>...]
Инструкция EXPOSE
сообщает Docker, что контейнер прослушивает указанные сетевые порты во время выполнения. Вы можете указать, будет ли порт прослушивать TCP или UDP, и по умолчанию используется TCP, если вы не укажете протокол.
Инструкция EXPOSE
на самом деле не публикует порт. Он функционирует как своего рода документация между человеком, создающим образ, и человеком, запускающим контейнер, о том, какие порты предполагается публиковать. Чтобы опубликовать порт при запуске контейнера, используйте флаг -p
on docker run
для публикации и сопоставления одного или нескольких портов или флаг -P
для публикации всех открытых портов и сопоставления их с портами более высокого порядка.
По умолчанию EXPOSE
предполагается TCP. Вы также можете указать UDP:
EXPOSE 80/udp
Чтобы открыть доступ как для TCP, так и для UDP, включите две строки:
EXPOSE 80/tcp
EXPOSE 80/udp
В этом случае, если вы используете -P
with docker run
, порт будет открыт один раз для TCP и один раз для UDP. Помните, что при этом -P
используется эфемерный порт хоста высокого порядка на хосте, поэтому TCP и UDP не используют один и тот же порт.
Независимо от EXPOSE
настроек, вы можете переопределить их во время выполнения, используя этот -p
флаг. Например
$ docker run -p 80:80/tcp -p 80:80/udp ...
Чтобы настроить перенаправление портов в хост-системе, см. использование флага -P . Команда docker network
поддерживает создание сетей для связи между контейнерами без необходимости раскрывать или публиковать определенные порты, поскольку контейнеры, подключенные к сети, могут взаимодействовать друг с другом через любой порт.