English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 install wget RUN wget -O redis.tar.gz \ RUN tar -xvf redis.tar.gz Выполнение вышеупомянутых действий создаст 3 слоя образа. Это можно упростить до следующего формата: FROM centos RUN yum install wget \ && wget -O redis.tar.gz \ && tar -xvf redis.tar.gz
Как показано выше, команды соединены символом &&, и после выполнения будет создан только один слой образа.
В директории, где хранится файл Dockerfile, выполняется действие по созданию.
В данном примере через Dockerfile, находящийся в папке, создаётся образ nginx:v3 (имя образа: метка образа).
Примечание∶ Последняя точка . 代表着本次执行的上下вонтекстный путь, в следующем разделе будет рассказано об этом.
$ docker build -t nginx:v3 .
Как показано выше, это означает, что образ был успешно создан.
В предыдущем разделе упоминалось, что последняя точка . в инструкции является путём контекста, то что такое путь контекста?
$ docker build -t nginx:v3 .
Путь контекста, это то, что Docker использует при создании образа, иногда он хочет использовать файлы на текущем компьютере (например, копировать), и команда docker build узнает этот путь, а затем пакует все содержимое в этом пути.
АнализПоскольку режим работы docker - это C/S. Наша машина - это C, а docker engine - это S. Реальный процесс создания выполняется в docker engine, поэтому в этот момент невозможно использовать файлы нашей машины. Это требует того, чтобы мы упаковали файлы из определенного каталога нашей машины и предоставили их docker engine для использования.
Если не указан последний параметр, то по умолчанию путь контекста будет местоположением Dockerfile.
ВниманиеНе следует размещать бесполезные файлы в контексте, так как они будут отправлены вместе с docker в-engine, если файлов слишком много, это может замедлить процесс.
Инструкция по копированию файлов или каталогов из каталога контекста в указанный путь в контейнере.
Формат:
COPY [--chown=<user>:<group>] <источник файла1>... <целевая папка> COPY [--chown=<user>:<group>] [<источник файла1>,... <целевая папка>]
[--chown=<user>:<group>]Опциональный параметр, позволяющий пользователю изменить владельца и группу файла, который копируется в контейнер.
<путь источника>Указанный файл или каталог, здесь может быть выражение шаблона, правила подстановки должны соответствовать правилам filepath.Match в Go. Например:
COPY hom* /mydir/ COPY hom?.txt /mydir/
<целевая папка>Указанный путь в контейнере, этот путь не нужно создавать заранее, если путь не существует, он будет автоматически создан.
Формат использования инструкции ADD аналогичен формату COPY (официально рекомендуется использовать COPY). Функции также аналогичны, но есть некоторые различия:
Преимущества ADD: При выполнении <источник файла> в формате tar-архива, если формат сжатия gzip, bzip2 или xz, автоматически копируется и разархивируется в <целевую папку>.
Недостатки ADD: Без разархивации невозможно скопировать файлы tar-архива. Это может привести к тому, что кэш 构建 изображения будет无效ен, что может замедлить процесс создания изображения. Нужен ли он, можно определить, нужно ли автоматически разархивировать.
Аналогичен инструкции RUN, используется для запуска программы, но время выполнения differs:
CMD запускается при docker run.
RUN используется в docker build.
ФункцияУказание программы по умолчанию, которая должна запускаться в контейнере. При завершении работы программы контейнер также завершает свою работу. Программа, указанная инструкцией CMD, может быть заменена программой, указанной параметром команды docker run.
ВниманиеЕсли в Dockerfile есть несколько инструкций CMD, то работает только последняя.
Формат:
CMD <shell команда> CMD ["<исполняемый файл или команда>","<параметр1>","<параметр2>",...] CMD ["<параметр1>","<параметр2>",...] # это написание предназначено для предоставления программы, указанной командой ENTRYPOINT, по умолчанию параметрами
Рекомендуется использовать второй формат, так как процесс выполнения более ясен. Первый формат на самом деле также автоматически преобразуется во второй формат при выполнении и по умолчанию Исполняемый файл - sh.
Аналогично команде CMD, но она не может быть заменена командной строкой docker run, и эти командные строки передаются в качестве параметров программе,指定的ой командой ENTRYPOINT.
Но, если при выполнении docker run используется опция --entrypoint, она заменяет команду CMD.
Преимущества: При выполнении docker run можно указать параметры для выполнения ENTRYPOINT.
Внимание: Если в Dockerfile есть несколько инструкций ENTRYPOINT, то действует только последняя.
Формат:
ENTRYPOINT ["<исполняемый файл>","<параметр1>","<параметр2>",...]
Можно использовать команду 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 <key> <value> ENV <ключ1>=<значение1> <ключ2>=<значение2>...
Ниже приведен пример настройки 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"
Параметры 构建, такие же, как и ENV. Но область действия不一样. Установленные ARG переменные окружения действуют только в Dockerfile, то есть только в процессе docker build, в готовом образе не существует этой переменной окружения.
В команде 构建 docker build можно использовать --build-arg <имя параметра>=<значение> для замены.
Формат:
ARG <имя параметра>[=<значение по умолчанию>]
Определить анонимный том данных. Если при запуске контейнера забыть монтировать том данных, он автоматически будет монтироваться на анонимный том.
Функция:
Избегать потери важных данных из-за перезапуска контейнера, это может быть смертельно опасно.
Избегать того, чтобы контейнер постоянно увеличивался в размерах.
Формат:
VOLUME ["<путь1>", "<путь2>"...] VOLUME <путь>
При запуске контейнера docker run мы можем изменить точку монтирования через параметр -v.
Только только объявляет порт.
Функция:
Помогает пользователю образа понять, какие порты используются для守护ского процесса этого образа, чтобы можно было настроить маппинг.
При использовании случайного порт-маппинга в процессе выполнения, то есть при docker run -P, автоматически будет случайным образом маппинг портов, указанных в EXPOSE.
Формат:
EXPOSE <порт1> [<порт2>...]
Указать рабочую директорию. Директория, указанная с помощью WORKDIR, будет существовать на каждом слое при создании образа. (Директория, указанная с помощью WORKDIR, должна быть создана заранее).
В процессе создания образа docker build каждый RUN-команды создает новый слой. Только директории, созданные через WORKDIR, будут существовать вечно.
Формат:
WORKDIR <путь к рабочей директории>
Для указания пользователя и группы пользователей для выполнения последующих команд, здесь просто переключается пользователь для выполнения последующих команд (пользователь и группа пользователей должны существовать заранее).
Формат:
USER <имя пользователя>[:<группа пользователей>]
Используется для определения某个 программы или команды для мониторинга состояния выполнения docker контейнера.
Формат:
HEALTHCHECK [опции] CMD <команда>:Устанавливает команду для проверки состояния здоровья контейнера HEALTHCHECK NONE:Если базовое изображение имеет команду проверки здоровья, это dòng có thể屏蔽掉 ее команду проверки здоровья HEALTHCHECK [опции] CMD <команда> : Команда, которая следует за CMD, может быть использована, как указано в использовании CMD.
Используется для задержки выполнения команд при строительстве. Проще говоря, команды,指定的 ONBUILD в Dockerfile, не будут выполняться в процессе текущего строительства изображения (предположим, изображение test-build). При использовании нового Dockerfile, который использует ранее построенное изображение FROM test-build, команды ONBUILD в Dockerfile test-build будут выполнены при строительстве нового изображения.
Формат:
ONBUILD <другие инструкции>