Docker Dockerfile

Что такое Dockerfile?

Dockerfile — это текстовый файл, содержащий все инструкции для сборки образа Docker.

Dockerfile — это текстовый файл, используемый для сборки образа. Его текстовое содержимое содержит инструкции и пояснения, необходимые для сборки образа.

Определяя последовательность команд и параметров, Dockerfile направляет Docker в процессе сборки пользовательского образа.

Использование Dockerfile для настройки образов

Здесь мы только объясняем, как запустить файл Dockerfile для настройки образа. Подробное объяснение инструкций внутри Dockerfile будет представлено в следующем разделе. Здесь вам нужно только понять процесс сборки.

1. Ниже мы настроим образ nginx (собранный образ будет содержать файл /usr/share/nginx/html/index.html)

В пустом каталоге создайте новый файл с именем Dockerfile и добавьте в этот файл следующее содержимое:

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

2. Роль инструкций FROM и RUN

FROM: Пользовательские образы основаны на образе FROM. Здесь nginx — это базовый образ, необходимый для настройки. Все последующие операции выполняются на основе nginx.

RUN: Используется для выполнения следующей за ней команды командной строки. Имеет следующие два формата:

формат shell:

RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

формат exec:

RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

Примечание: Каждый раз, когда выполняется инструкция в Dockerfile, в Docker создается новый слой. Поэтому слишком много бессмысленных слоев приведет к тому, что образ станет слишком большим. Например:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

Приведённое выше выполнение создаст 3-слойный образ. Его можно упростить до следующего формата:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

Как указано выше, используйте&&Используйте "&&" для соединения команд, поэтому после выполнения будет создан только один слой образа.

Начните сборку образа

В каталоге, где находится файл Dockerfile, выполните действие сборки.

В следующем примере создаётся nginx:v3 (имя образа:тег образа) с помощью Dockerfile в каталоге.

Примечание: последняя.обозначает контекстный путь для этого выполнения, который будет представлен в следующем разделе.

$ docker build -t nginx:v3 .

Приведённый выше вывод показывает, что сборка прошла успешно.

путь контекста

В предыдущем разделе упоминалось, что последняя часть команды.— это путь контекста. Так что же такое путь контекста?

$ docker build -t nginx:v3 .

Путь контекста означает, что когда docker собирает образ, иногда он хочет использовать файлы с локальной машины (например, копирование). После того как команда docker build узнаёт этот путь, она упакует всё содержимое по этому пути.

Разбор:Поскольку режим работы docker — C/S. Наша локальная машина — C, а движок docker — S. Фактический процесс сборки выполняется под движком docker, поэтому файлы на нашей локальной машине в данный момент не могут быть использованы. Это требует упаковки файлов в указанном каталоге на нашей локальной машине и предоставления их движку docker для использования.

Если последний параметр не указан, путь контекста по умолчанию — это расположение, в котором находится Dockerfile.

Примечание: Не размещайте бесполезные файлы в пути контекста, потому что они будут упакованы и отправлены вместе в движок Docker. Если файлов слишком много, процесс будет медленным.


Подробности инструкций

Инструкции DockerfileОписание
FROMУказывает базовый образ для последующей сборки инструкций.
MAINTAINERУказывает автора/сопровождающего Dockerfile. (Устарело, рекомендуется использовать инструкцию LABEL)
LABELДобавляет метаданные к образу с помощью пар ключ-значение.
RUNВыполняет команды в образе во время процесса сборки.
CMDУказывает команду по умолчанию при создании контейнера. (Может быть переопределена)
ENTRYPOINTУстанавливает основную команду при создании контейнера. (Не может быть переопределена)
EXPOSEОбъявляет конкретные сетевые порты, которые контейнер прослушивает во время выполнения.
ENVЗадает переменные среды внутри контейнера.
ADDКопирует файлы, каталоги или удаленные URL-адреса в образ.
COPYКопирует файлы или каталоги в образ.
VOLUMEСоздает точки монтирования для контейнера или объявляет тома.
WORKDIRЗадает рабочий каталог для последующих инструкций.
USERЗадает контекст пользователя для последующих инструкций.
ARGОпределяет переменные, передаваемые сборщику во время процесса сборки, которые можно задать с помощью команды "docker build".
ONBUILDДобавляет триггеры, когда этот образ используется в качестве базового для другого процесса сборки.
STOPSIGNALЗадает системный сигнал, отправляемый контейнеру для выхода.
HEALTHCHECKОпределяет команду для периодической проверки состояния работоспособности контейнера.
SHELLПереопределяет оболочку по умолчанию в Docker, используемую для инструкций RUN, CMD и ENTRYPOINT.

COPY

Инструкция Copy копирует файлы или каталоги из каталога контекста в указанный путь в контейнере.

Формат:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

[--chown=<user>:<group>]:Необязательный параметр, изменяет владельца и группу файлов, скопированных в контейнер.

<source path>:Исходный файл или исходный каталог, который здесь может быть выражением с подстановочными знаками. Его правила подстановочных знаков должны соответствовать правилам filepath.Match в Go. Например:

COPY hom* /mydir/
COPY hom?.txt /mydir/

<target path>: Указанный путь внутри контейнера. Этот путь не нужно создавать заранее; если он не существует, он будет создан автоматически.

ADD

Формат использования инструкции ADD аналогичен COPY (при тех же требованиях официально рекомендуется использовать COPY). Функции также схожи, различия следующие:

  • Преимущества ADD: когда <source file> является tar-архивом, а формат сжатия — gzip, bzip2 или xz, он автоматически скопирует и распакует его в <destination path>.
  • Недостатки ADD: он не может копировать tar-архивы без распаковки. Это аннулирует кэш сборки образа, что может сделать сборку образа относительно медленной. Нужно ли его использовать, можно определить по тому, нужна ли автоматическая распаковка.

CMD

Подобно инструкции RUN, она используется для запуска программ, но они выполняются в разные моменты времени:

  • CMD выполняется во время docker run.
  • RUN — во время docker build.

Функция: Указывает программу по умолчанию, которая будет запущена в запущенном контейнере. Когда программа завершает работу, контейнер также завершается. Программа, указанная в инструкции CMD, может быть переопределена программой, указанной в параметрах командной строки docker run.

Примечание: Если в Dockerfile несколько инструкций CMD, действует только последняя.

Формат:

CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

Рекомендуется второй формат, так как процесс выполнения относительно понятен. В реальной работе первый формат также будет автоматически преобразован во второй, а исполняемым файлом по умолчанию является sh.

ENTRYPOINT

Подобно инструкции CMD, но она не будет переопределена командой, указанной в аргументах командной строки docker run. Более того, эти аргументы командной строки будут переданы как параметры программе, указанной в инструкции ENTRYPOINT.

Однако, если при запуске docker run используется опция --entrypoint, она переопределит программу, указанную в инструкции ENTRYPOINT.

Преимущества: при выполнении docker run можно указать параметры, необходимые для запуска ENTRYPOINT.

Примечание: если в Dockerfile несколько инструкций ENTRYPOINT, действует только последняя.

Формат:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

Его можно использовать вместе с командой CMD: обычно CMD применяется для переменных параметров. Здесь CMD эквивалентна передаче параметров в ENTRYPOINT, о чём будет сказано в примере ниже.

Пример:

Предположим, образ nginx:test уже собран из Dockerfile:

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参 

1. Запуск без передачи параметров

$ docker run  nginx:test

По умолчанию контейнер выполнит следующую команду для запуска основного процесса.

nginx -c /etc/nginx/nginx.conf

2. Запуск с параметрами

$ docker run  nginx:test -c /etc/nginx/new.conf

По умолчанию контейнер выполнит следующую команду для запуска основного процесса (/etc/nginx/new.conf: предполагается, что этот файл уже существует в контейнере).

nginx -c /etc/nginx/new.conf

ENV

Задаёт переменные среды. После определения переменной среды её можно использовать в последующих инструкциях.

Формат:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...

В следующем примере задаётся NODE_VERSION = 7.2.0, на неё можно ссылаться через $NODE_VERSION в последующих инструкциях:

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"

ARG

Параметры сборки, действуют так же, как ENV. Однако область действия отличается. Переменные среды, заданные ARG, действительны только внутри Dockerfile, то есть только во время процесса docker build. В собранном образе этой переменной среды нет.

В команде сборки `docker build` его можно переопределить с помощью `--build-arg <parameter-name>=<value>`.

Формат:

ARG <参数名>[=<默认值>]

VOLUME

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

Функции:

  • Предотвращает потерю важных данных из-за перезапуска контейнера, что крайне важно.
  • Позволяет избежать постоянного увеличения размера контейнера.

Формат:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

При запуске контейнера с помощью docker run мы можем изменить точку монтирования с помощью параметра -v.

EXPOSE

Только объявляет порты.

Функции:

  • Помогает пользователям образа понять порт демона этой службы образа, что упрощает настройку сопоставления.
  • При использовании случайного сопоставления портов во время выполнения, то есть docker run -P, порты, экспонированные EXPOSE, будут автоматически случайным образом сопоставлены.

Формат:

EXPOSE <端口1> [<端口2>...]

WORKDIR

Задаёт рабочий каталог. Рабочий каталог, указанный с помощью WORKDIR, будет существовать на каждом слое сборки образа. Текущий каталог для последующих слоёв будет изменён на указанный каталог. Если каталог не существует, WORKDIR создаст его для вас.

В процессе docker build каждая команда RUN создаёт новый слой. Только каталоги, созданные с помощью WORKDIR, всегда будут существовать.

Формат:

WORKDIR <工作目录路径>

USER

Используется для указания пользователя и группы пользователей для выполнения последующих команд. Здесь он только переключает пользователя для выполнения последующих команд (пользователь и группа пользователей должны существовать заранее).

Формат:

USER <用户名>[:<用户组>]

HEALTHCHECK

Используется для указания программы или инструкции для мониторинга состояния работы службы docker-контейнера.

Формат:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

ONBUILD

Используется для отложенного выполнения команд сборки. Проще говоря, команды, указанные с помощью ONBUILD в Dockerfile, не будут выполняться в процессе текущей сборки образа (предположим, образ — test-build). Когда в новом Dockerfile используется ранее собранный образ с помощью FROM test-build, тогда при сборке Dockerfile нового образа будут выполнены команды, указанные с помощью ONBUILD в Dockerfile образа test-build.

Формат:

ONBUILD <其它指令>

LABEL

Инструкция LABEL используется для добавления некоторых метаданных к образу в виде пар ключ-значение. Синтаксис следующий:

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

Например, мы можем добавить автора образа:

LABEL org.opencontainers.image.authors="example"
Другие расширения