Dockerfile

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"]

Рекомендации :

  1. ENTRYPOINT определяет какой исполняемый файл запускать
  2. CMD используется для указания аргументов для исполняемого файла указанного в ENTRYPOINT

 

Инструкция WORKDIR

WORKDIR /path/to/workdir

Инструкция WORKDIR  устанавливает рабочий каталог для любых инструкций RUNCMD, и 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 поддерживает создание сетей для связи между контейнерами без необходимости раскрывать или публиковать определенные порты, поскольку контейнеры, подключенные к сети, могут взаимодействовать друг с другом через любой порт.