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
Выполненные команды не перезаписываютсяENTRYPOINT
,иdocker 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"]
Том может существовать в одном или нескольких контейнерах в указанном каталоге, минуя объединенную файловую систему, и имеет следующие возможности:
- Тома могут совместно использоваться и повторно использоваться между контейнерами
- Контейнерам не нужно делиться томами с другими контейнерами.
- Он вступит в силу сразу после изменения громкости
- Изменения громкости не влияют на зеркало
- Том сохраняется до тех пор, пока его не использует ни один контейнер.
и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 获取更多资讯