Скрипт сборки Docker Полный анализ инструкции Dockerfile

контейнер Docker

1. Введение

Dockerfileиспользуется для создания пользовательскихDockerЗеркальный текстовый документ. мы проходимdocker buildкоманда для использования изDockerfileобраз сборки файла. Если вы создаете собственный образ,Dockerfileявляется одним из навыков, которым вы должны научиться.

2. Базовая структура Dockerfile

DockerfileОбычно делится на: базовое изображение, метаинформация изображения, инструкции по работе с изображением и инструкции по выполнению при запуске контейнера,#заDockerfileПримечания в .

3. Описание файла Dockerfile

Dockerбежать сверху внизDockerfileинструкции, каждая из которых начинается сstepдля шагов. И имя файла тоже должно бытьDockerfile.

4. Часто используемые инструкции в Dockerfile.

Далее обычно используетсяDockerfileИнструкции обобщены.

4.1 Инструкция ОТ

FROMЭто указанное базовое изображение, которое должно быть первой командой Формат:

FROM <image>:<tag>

вtagилиdigestявляется необязательным, если эти два значения не используются, будет использоватьсяlatestверсия базового образа.

Пример:FROM mysql:5.6

4.2 MAINTAINERинструкция

MAINTAINERИспользуется для объявления информации сопровождающего,Срок действия заказа истек,Рекомендуемое использованиеLABEL,Формат:

MAINTAINER <name>

4.3 ЭТИКЕТКА Инструкция

МЕТКА: используется для добавления метаданных к изображениям, в основном используется для объявления информации о сборке, авторах, учреждениях, организациях и т. д. Формат:

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

Пример:LABEL version="1.0" description="felord.cn" by="Felordcn"

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

4.4 Инструкция ENV

ENVИспользуется для установки переменных окружения, формат:

ENV <key> <value>  
 
ENV <key>=<value>  

Пример:ENV version 1.0.0илиENV version=1.0.0

в состоянии пройти${key}для ссылки на переменные в других инструкциях, таких как${version}. Мы также можем пройтиdocker runсередина-e <ENV>назначать динамически

4.5 Инструкция ARG

ARGИспользуется для указания переменных, передаваемых среде выполнения сборки, в формате:

ARG <name>[=<default value>]

пройти черезdocker runсередина--build-arg <key>=<value>Для динамического назначения, если не указано, будет использоваться его значение по умолчанию.

4.6 Команда РАБОЧИЙКАТАЛОГ

WORKDIRИспользуется для указания рабочего каталога, аналогично тому, что мы обычно используемcdкоманда, формат:

WORKDIR <PATH>

пройти черезWORKDIRустановить рабочий каталог,Dockerfileдругие инструкции вRUN,CMD,ENTRYPOINT,ADD,COPYи другие команды будут выполняться в этом каталоге. в настоящее время используетdocker runПри запуске контейнера вы можете передать-wПараметр переопределяет рабочий каталог, заданный во время сборки.

4.7 ДОБАВИТЬ инструкцию

ADDдля добавления локальных файлов на зеркало,tarФайлы типов будут автоматически распаковываться (сетевые сжатые ресурсы не будут распаковываться), и доступ к сетевым ресурсам будет возможен, как и в случаеwget,Формат:

 ADD <src>... <dest>
 # 用于支持包含空格的路径
 ADD ["<src>",... "<dest>"] 

Пример:

ADD home* /path/ # поддерживает подстановочные знаки * добавить все файлы, начинающиеся с «home», в /path/

4.8 КОПИРОВАНИЕ Инструкция

COPYтакие функции, какADD, но не будет автоматически распаковывать файл и не сможет получить доступ к сетевым ресурсам

4.9 Инструкция ПУСК

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

  • shellФормат исполнения:

RUN <command>

Пример:RUN apk update

  • execФормат исполнения:

RUN ["executable", "param1", "param2"]

Пример:RUN ["/dev/file", "p1", "p2"]

нужно знать, это:RUNПромежуточные образы, созданные директивой, кэшируются и используются в следующей сборке. Если вы не хотите использовать кешированное изображение, вы можете указать его во время сборки.--no-cacheпараметры, пример:docker build --no-cache

4.10 CMD-команда

CMDКоманда, выполняемая после сборки контейнера, то есть команда, выполняемая при запуске контейнера. Формат:

 # 执行可执行文件,优先执行
 CMD ["executable","param1","param2"]  
 # 设置了 ENTRYPOINT,则直接调用ENTRYPOINT添加参数  参见 CMD 讲解 
 CMD ["param1","param2"] 
 # 执行shell命令
 CMD command param1 param2  

Пример:CMD ["/usr/bin/bash","--help"]

CMDотличается отRUN,CMDИспользуется для указания команды, которая должна выполняться при запуске контейнера, а RUN используется для указания команды, которая должна выполняться при построении образа.

4.11 Инструкция ТОЧКА ВХОДА

ENTRYPOINTИспользуется для настройки контейнера, чтобы сделать его исполняемым. СотрудничатьCMDможно опуститьapplication, используя только параметры. Формат:

 #可执行文件, 优先
 ENTRYPOINT ["executable", "param1", "param2"]  
 # shell内部命令
 ENTRYPOINT command param1 param2  

Пример:

    FROM ubuntu

    ENTRYPOINT ["top", "-b"]

    CMD ["-c"] 

ENTRYPOINTиCMDочень похоже, за исключением того, чтоdocker runВыполненные команды не перезаписываютсяENTRYPOINTdocker runЛюбые параметры, указанные в команде, будут снова переданы в качестве параметров дляENTRYPOINTинструкция.Dockerfileтолько последнийENTRYPOINTкоманда работает, то есть если указать несколькоENTRYPOINT, выполнить только последнийENTRYPOINTинструкция.

4.12 Инструкция ЭКСПОЗИЦИЯ

EXPOSEУкажите порт для взаимодействия с внешним миром в формате:

EXPOSE [<port>...]

Пример:EXPOSE 8080 443,EXPOSE 80,EXPOSE 11431/tcp 12551/udp

EXPOSEОн не сопоставляет напрямую порт контейнера с хостом. Когда хост обращается к порту контейнера, ему необходимоdocker runпри запуске контейнера через-pопубликовать эти порты или через-Pпараметры для публикацииEXPOSEВсе порты экспортированы

4.13 Команда ГРОМКОСТЬ

VOLUMEИспользуется для указания постоянного каталога, формат:

VOLUME ["<src>",...]

Пример:VOLUME ["/data"],VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]

Том может существовать в одном или нескольких контейнерах в указанном каталоге, минуя объединенную файловую систему, и имеет следующие возможности:

  1. Тома могут совместно использоваться и повторно использоваться между контейнерами
  2. Контейнерам не нужно делиться томами с другими контейнерами.
  3. Он вступит в силу сразу после изменения громкости
  4. Изменения громкости не влияют на зеркало
  5. Том сохраняется до тех пор, пока его не использует ни один контейнер.

иEXPOSEИнструкции аналогичны,VOLUMEХосты, которые не будут монтироваться, должны пройтиdocker runпри запуске контейнера через-vдля сопоставления с каталогом хоста. увидеть другую командуdocker volume create

4.14 ПОЛЬЗОВАТЕЛЬСКАЯ команда

USERУкажите имя пользователя при запуске контейнера илиUID,ПоследующийRUNТакже используется именованный пользователь. использоватьUSERПри указании пользователя вы можете использовать имя пользователя,UIDилиGID, или их комбинация. Если службе не требуются права администратора, вы можете указать работающего пользователя с помощью этой команды. А создать нужных пользователей можно раньше, в формате:

USER user
USER user:group
USER uid:group
USER uid
USER user:gid
USER uid:gid

использоватьUSERПосле указания пользователяDockerfileв следующей командеRUN,CMD,ENTRYPOINTбудет использовать этого пользователя. ты можешь пройтиdocker runПри запуске контейнера вы можете передать-uпараметр для переопределения указанного пользователя.

4.15 Инструкция по сборке

ONBUILDРоль заключается в том, что когда построенный образ используется в качестве базового образа для других образов,ONBUILDКоманда in сработает, формат:

ONBUILD [INSTRUCTION]

Пример:

ONBUILD ADD . /application/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src 

5. Резюме

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

Прикреплен: Spring Boot Dockerfile

   # 使用 aws 的java jdk 8
   FROM amazoncorretto:8
   # 作者等相关的元信息
   LABEL AUTHOR=Felordcn OG=felord.cn
   # 挂载卷 
   VOLUME ["/tmp","/logs"]
   # 时区
   ENV TZ=Asia/Shanghai
   # 启用配置文件 默认为 application.yml  
   ENV ACTIVE=defualt
   # 设置镜像时区
   RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
   # 修改为打包后的jar文件名称
   ADD /target/flyway-spring-boot-1.0.0.jar app.jar
   ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dspring.profiles.active=${ACTIVE}","-jar","app.jar"]

关注公众号:Felordcn 获取更多资讯

Личный блог: https://felord.cn