Что такое Dockerfile
Dockerfile на самом деле представляет собой файл, в котором записан шаг «запуска ракеты», в котором записаны шаги по созданию нового образа из одного образа. После написания файла Dockerfile мы можем легко его использовать.docker buildкоманда для создания образа.
Dockerfile — это текстовый файл, содержащий инструкции, каждая инструкция создает слой, поэтому содержимое каждой инструкции должно описывать, как должен быть построен слой. С Dockerfile, когда нам нужно настроить наши собственные дополнительные требования, нам нужно только добавить или изменить инструкции в Dockerfile для повторного создания образа, избавляя от необходимости вводить команды.
Вот пример dockerfile:
FROM openjdk:8-jdk-alpine
MAINTAINER Kurisu "makise_kurisuu@outlook.jp"
LABEL maintainer="makise_kurisuu@outlook.jp"
VOLUME /tmp
ARG JAR_FILE=target/alice-server.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Компоненты Dockerfile
| часть | Заказ |
|---|---|
| базовая информация об изображении | FROM |
| информация о сопровождающем | MAINTAINER |
| инструкция по работе с зеркалом | RUN, COPY, ADD, EXPOSE, WORKDIR, ONBUILD, USER, VOLUME и т. д. |
| Выполнять команды при запуске контейнера | CMD, ТОЧКА ВХОДА |
Сведения о команде DockerFile
-
FROM
Построенный образ устанавливает базовый образFROM <image> [AS <name>] FROM <image>[:<tag>] [AS <name>] FROM <image>[@<digest>] [AS <name>]FROMДиректива инициализирует новую фазу сборки и устанавливает базовый образ для последующих директив, например:FROM openjdk:8-jdk-alpine. Поэтому Dockerfile должен начинаться сFROMначинается команда. Указанное зеркало может быть любым допустимым зеркалом (рекомендуется зеркало из общедоступного репозитория, поскольку его легче извлечь).- в докерфайле
ARGединственное, что можно использовать дляFROMпредыдущая инструкция.
ARG CODE_VERSION=latest FROM base:${CODE_VERSION} CMD /code/run-app FROM extras:${CODE_VERSION} CMD /code/run-extras- Dockerfile может иметь несколько инструкций FROM для создания нескольких образов или использования одного этапа в качестве зависимости от другого. Возьмите идентификатор последнего зеркала в качестве выходного значения. например:
FROM golang:1.10.3 COPY server.go /build/ WORKDIR /build RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o server ENTRYPOINT ["/build/server"]- Мы можем сделать это с помощью
FROMдобавлено в командуAS 名称чтобы присвоить имя следующему этапуFROMиCOPY --from=<name|index>использовать. - тег и дайджест являются необязательными, последний используется, если не указан.
- в докерфайле
-
RUN
Выполнение определенных команд в процессе сборки образа и создание промежуточного образа. Например, чтобы установить некоторое программное обеспечение и настроить некоторые базовые среды, вы можете использовать \ для переноса строки.RUN <command> (shell格式) RUN ["executable", "param1", "param2"] (exec格式)Следует отметить, что исполняемый файл — это команда, а следующий параметр — параметр
Команды в формате exec будут преобразованы в формат json, поэтому нельзя использовать одинарные кавычки, а также необходимо передавать обратную косую черту, что особенно важно в Windows. -
CMD
Указывает параметры по умолчанию для среды выполнения контейнера.CMD ["executable","param1","param2"](exec格式,首选) CMD ["param1","param2"](给ENTRYPOINT提供默认参数) CMD command param1 param2(shell格式)Уведомление:
RUNвыполняется во время сборки и генерирует новый образ,CMDНичего не делать во время сборки, выполнять во время работы контейнера.
еслиCMDДляENTRYPOINTИнструкция предоставляет параметры по умолчанию, затемCMDиENTRYPOINTВсе директивы должны использовать формат массива JSON. -
LABEL
Отметьте построенный образ.LABEL <key>=<value> <key>=<value> <key>=<value> ...Ярлыки представлены в формате пары "ключ-значение". Чтобы включить пробелы в ярлыки, необходимо использовать escape-символы или использовать кавычки.
"скобка. например: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."Изображение может иметь несколько тегов.Если базовое изображение также имеет теги, оно будет унаследовано, а если имя такое же, оно будет перезаписано. Если используется несколько тегов, рекомендуется объединить их в одну инструкцию тега. Тогда каждая инструкция метки будет генерировать слой, что приведет к неэффективной генерации изображения. Возьмите каштан:
LABEL multi.label1="value1" multi.label2="value2" other="value3"Это также может быть записано как:
LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3" -
MAINTAINER (устарело)
Установить информацию об авторе.MAINTAINER <name>LABELСравниватьMAINTAINERБолее гибкий и рекомендуемыйLABEL, устарелоMAINTAINER.LABEL maintainer="makise_kurisuu@outlook.jp" -
EXPOSE
Установите порт прослушивания для созданного образа.EXPOSE <port> [<port>/<protocol>...]EXPOSEИнструкция позволяет Docker-контейнеру прослушивать указанный порт во время его работы.Вы можете указать, является ли порт протоколом upd или tcp.Если не указано, протокол tcp по умолчанию.
EXPOSEКоманда не публикует порты. Если вы публикуете порты, вам нужно использовать -p для публикации и сопоставления одного или нескольких портов контейнера во время запуска докера или использовать -P для публикации всех открытых портов. и сопоставьте их с портами более высокого порядка. -
ENV
Задание переменных среды в построенном образе можно использовать непосредственно в последующих инструкциях Dockerfile или закрепить в образе, который по-прежнему действителен во время работы контейнера.ENVИнструкции бывают двух форматов:- ENV: все значения после первого пробела считаются значениями, и несколько переменных окружения не могут быть установлены в одной строке.
- ENV=...: можно установить несколько переменных среды, если в них есть пробелы, их нужно экранировать или заключить в кавычки.
"скобка.
ENV myName John Doe ENV myDog Rex The Dog ENV myCat fluffyили
ENV myName="John Doe" myDog=Rex\ The\ Dog \ myCat=fluffyРекомендуется использовать второй, который также может уменьшить количество слоев и повысить эффективность.
Примечание. Вы можете указать переменные среды во время работы контейнера, чтобы заменить существующие переменные в образе.
docker run --env <key>=<value>.
Использование ENV может повлиять на последующие инструкции Dockerfile.Если вам нужно установить переменные среды только для одной инструкции, вы можете использовать этот метод:RUN <key>=<value> <command> -
ADD
При создании образа скопируйте файлы в контексте в образ.ADD <src>... <dest> ADD ["<src>",... "<dest>"](路径包含空格的必须使用这种格式)<src>Может быть файлом, каталогом или URL-адресом файла. Вы можете использовать нечеткое сопоставление (подстановочные знаки, аналогичные сопоставлению оболочки), вы можете указать несколько<src>, должен находиться в контекстном каталоге и подкаталогах, не могу добавить../a.txtтакой файл. если<src>является каталогом, копируется все содержимое каталога, кроме самого каталога. если<src>Это сжатый пакет, который может быть распознан докером, Docker распакует его с помощью tar -x и скопирует содержимое в<desct>.<dest>Может быть абсолютным или относительным путем к каталогу WORKDIR. Все файлы имеют UID и GID равные 0.Если докер обнаружит, что содержимое файла изменилось, следующие инструкции не будут использовать кеш.
Что касается /, который необходимо обрабатывать при копировании файлов, то он в основном такой же, как и при обычном копировании. -
COPY
Скопируйте файлы хоста в образ. Если место назначения не существует, Docker автоматически создаст все необходимые структуры каталогов, но это будет просто копия, и она не будет извлекать и распаковывать файлы.COPY <src>... <dest> COPY ["<src>",... "<dest>"](路径包含空格的必须使用这种格式)Примечание. Копируемый каталог должен находиться в том же каталоге, что и Dockerfile.
Потому что среда сборки будет загружена в демон Docker, а копирование выполняется в демоне Docker. Все, что находится за пределами среды сборки, недоступно. Назначение инструкции COPY должно быть абсолютным путем внутри контейнера.
КОПИРОВАТЬ инструкцию -
ENTRYPOINT
Указывает исполнителя образа.ENTRYPOINTИнструкции бывают двух форматов:ENTRYPOINT ["executable", "param1", "param2"] (执行格式,首选) ENTRYPOINT command param1 param2 (shell格式)Подробная ссылка:ТОЧКА ВХОДА инструкция
CMDиENTRYPOINTПо крайней мере один должен быть использован.ENTRYPOINTСледует рассматривать как исполняемый файл докера, CMD следует рассматривать какENTRYPOINTпараметры по умолчанию.docker run <image> <arg1> <arg2> ...передаст следующие параметры вENTRYPOINT, переопределяя параметры, указанные CMD. Можно использоватьdocker run --entrypointсбросить настройки по умолчаниюENTRYPOINT.— No ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT ["exec_entry", "p1_entry"] No CMD error, not allowed /bin/sh -c exec_entry p1_entry exec_entry p1_entry CMD ["exec_cmd", "p1_cmd"] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry exec_cmd p1_cmd CMD ["p1_cmd", "p2_cmd"] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry p1_cmd p2_cmd CMD exec_cmd p1_cmd CMD exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd -
VOLUME
Каталог в указанном зеркале является томом данных.VOLUME ["/data"]Когда контейнер запущен, Docker скопирует содержимое тома данных в образе в том данных контейнера. Если содержимое тома данных изменено в следующих инструкциях Dockerfile, изменение будет недействительным.
-
USER
Укажите пользователя для следующих инструкций Dockerfile. Затронутые команды:RUN,CMD,ENTRYPOINT.USER <user>[:<group>] or USER <UID>[:<GID>]Примечание. Если у пользователя нет основной группы, зеркальное отображение (или следующая инструкция) будет выполняться с этой корневой группой.
-
WORKDIR
Укажите текущий рабочий каталог для следующей инструкции Dockerfile, которую можно использовать несколько раз.Если используется относительный путь, он относится к предыдущему рабочему каталогу, аналогично команде cd в оболочке.WORKDIR /path/to/workdirЗатронутые команды:
RUN,CMD,ENTRYPOINT,COPYиADD. Может использоваться несколько раз в DockerfileWORKDIRинструкция. Если указан относительный путь, он будет относиться к предыдущемуWORKDIRПуть к директиве. Например:WORKDIR /a WORKDIR b WORKDIR c RUN pwdв этом Dockerfile
pwdкоманда выведет/a/b/c..
WORKDIRДирективы можно использовать перед синтаксическим анализомENVЗаданные переменные среды могут использовать только те переменные среды, которые явно заданы в Dockerfile. Например:ENV DIRPATH /path WORKDIR $DIRPATH/$DIRNAME RUN pwdв этом Dockerfile
pwdкоманда выведет/path/$DIRNAME. -
ARG
указанный пользователь вdocker build --build-arg <varname>=<value>параметры, которые можно использовать.ARG <name>[=<default value>]Если пользователь указывает параметры сборки, которые не определены в Dockerfile, сборка выводит предупреждение.
[Warning] One or more build-args [foo] were not consumed.Параметры сборки вступают в силу, когда они определены, а не когда они используются. Например, пользователь, начиная с третьей строки ниже, является пользователем, переданным параметрами сборки пользователя:
FROM busybox # 此处获取不到用户传来的user USER ${user:-some_user} ARG user USER $userты можешь использовать это
ARGилиENVобозначение инструкцииRUNПеременные, доступные директиве. использоватьENVПеременная среды, определенная директивой, всегда переопределяет переменную с тем же именем.ARGинструкция.FROM ubuntu ARG CONT_IMG_VER ENV CONT_IMG_VER v1.0.0 # 始终是v1.0.0 RUN echo $CONT_IMG_VERПравильное использование:
FROM ubuntu ARG CONT_IMG_VER ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0} RUN echo $CONT_IMG_VERЧтобы использовать аргумент на нескольких этапах, каждый этап должен содержать инструкцию ARG.
FROM busybox ARG SETTINGS RUN ./run/setup $SETTINGS FROM busybox ARG SETTINGS RUN ./run/other $SETTINGSКроме того, у docker также есть ряд встроенных параметров сборки, которые можно объявить без объявления в Dockerfile:
HTTP_PROXY,http_proxy,HTTPS_PROXY,https_proxy,FTP_PROXY,ftp_proxy,NO_PROXY,no_proxyПримечание. В директиве, которая использует параметры сборки (а не когда параметр сборки определен), если значение параметра сборки изменится, директива изменится, и кэш будет снова просканирован.
-
ONBUILD
Добавьте триггер к образу, и когда новый образ будет построен с изображением в качестве базового образа, он инициирует выполнение содержащихся в нем инструкций.ONBUILD [INSTRUCTION]Например, созданный нами образ используется для развертывания кода Python, но его можно использовать повторно, поскольку существует несколько проектов. Вы можете использовать так:
[...] # 在下一次以此镜像为base image的构建中,执行ADD . /app/src,将项目代目添加到新镜像中去 ONBUILD ADD . /app/src # 并且build Python代码 ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...]не допускается
ONBUILDИспользование директив ссылокONBUILD ONBUILD.
ONBUILDТолько изображения, унаследованные от дочерних узлов, не будут унаследованы дочерними узлами.
ONBUILDне сработаетFROM,MAINTAINERинструкция. -
STOPSIGNAL
Сигнал триггерной системы.STOPSIGNAL signalSTOPSIGNALИнструкция устанавливает сигнал системного вызова, который будет отправлен контейнеру для выхода. Этот сигнал может быть допустимым числом без знака (например, 9), совпадающим с позицией в таблице SysCall ядра, или именем сигнала в формате SIGNAME (например, SIGKILL). -
HEALTHCHECK
Добавьте пользовательскую функцию обнаружения сердцебиения, только последняя из них действительна после многократного использования. Формат:HEALTHCHECK [OPTIONS] CMD command (通过在容器内运行命令来检查容器运行状况) HEALTHCHECK NONE (禁用从基础映像继承的任何运行状况检查)Дополнительный вариант:
-
--interval=DURATION(интервал обнаружения, по умолчанию: 30 с) -
--timeout=DURATION(время ожидания команды, по умолчанию: 30 с) -
--start-period=DURATION(Время начала проверки после инициализации, значение по умолчанию: 0 с) -
--retries=N(отметить как неработоспособный после N последовательных сбоев, по умолчанию: 3 раза)
Start Period предоставляет время инициализации для контейнеров, которым требуется время для загрузки. Сбои зонда в течение этого периода не будут учитываться при расчете максимального количества повторных попыток. Однако, если проверка работоспособности завершается успешно во время запуска, контейнер будет считаться запущенным, и любые последовательные сбои будут учитываться при максимальном количестве повторных попыток.
<command>Может быть скриптом оболочки или массивом json в формате exec. докер начинается с<command>Код состояния выхода контейнера используется, чтобы определить, является ли контейнер работоспособным или нет, что согласуется с оболочкой:- 0: команда возвращается успешно, контейнер исправен
- 1: команда вернула ошибку, контейнер неисправен
- 2: сохранить код состояния, не использовать Например, проверьте, доступна ли локальная веб-страница каждые 5 минут, и установите время ожидания на 3 секунды:
HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1ты можешь использовать
docker inspectКоманда для проверки состояния здоровья.
Когда статус работоспособности контейнера изменяется, генерируется событие health_status с новым статусом. -
-
SHELL
Измените оболочку, используемую в последующих инструкциях Dockerfile. Оболочка по умолчанию["bin/sh", "-c"]. Можно использовать несколько раз, каждый раз меняя только последующие инструкции.SHELL ["executable", "parameters"]