Знание создания образов Docker: подробное объяснение команды Dockerfile.
Знание создания образов Docker: подробное объяснение команды Dockerfile.
В этой статье представлены Dock­er­file Типичная базовая структура и многочисленные инструкции, которые она поддерживает, а также подробное объяснение этих инструкций по написанию индивидуального зеркала. Dockerfile и как сгенерировать зеркало.

1.FROM указывает базовый образ

Инструкция FROM используется для указания Базазеркало, следующего за новым использовать зеркало. Если его нет локально,тогда по умолчанию он перейдет вDocker HubУказана загрузказеркало。FROMКоманда должна бытьDockerfileпервая команда в файле,После запуска процесса сборки,Докер будет основан на зеркалесоздать новое зеркало,Команда после FROM также будет основана на этом Базазеркало.

Язык кода:javascript
копировать
FROM Формат синтаксиса:
FROM или
FROM :или
FROM :

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

  • FROMдолжно бытьDockerfileсередина第一条非注释命令
  • существовать一个DockerfileСоздать несколько файловзеркалочас,FROM может появляться несколько раз. Просто предшествуйте каждой новой команде FROM,Запишите последний отправленный идентификатор зеркала.
  • тег или дайджест не являются обязательными,Если у вас нет этих двух ценностей, используйте,встречаиспользоватьltestверсия Базазеркало

2. Команда выполнения RUN

Выполняйте определенные команды в процессе создания образа и создайте промежуточное изображение. Формат:

Язык кода:javascript
копировать
#формат оболочки
RUN 
#exec формат
RUN ["executable", "param1", "param2"]
  • RUNКоманда будет в текущемimageВыполните любую допустимую команду и отправьте результаты выполнения.。После выполнения и подачи команды,就встреча自动осуществлятьDockerfileследующий винструкция.
  • Иерархия RUNинструкции и Создание коммитов — это практика, соответствующая основной философии Docker. Это позволяет контролировать версии, например,в любой момент,верноimageзеркало Настроитьстроить。
  • Промежуточные файлы, созданные командой RUN, будут кэшироваться.,И в следующий раз воспользуюсь сборкой. Если вы не хотите использовать эти тайники зеркало,Можно найти встроитьчас指定--no-cacheпараметр,нравиться:docker build --no-cache

3.CMD запускает контейнер

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

Язык кода:javascript
копировать
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

Опустите exec-формат исполняемого файла. При таком способе записи параметры CMD считаются параметрами по умолчанию для ENTRYPOINT. В настоящее время ENTRYPOINT также должен быть в формате exec. Для конкретного использования в сочетании с ENTRYPOINT см. Примечание. Отличие от команды RUN: RUN выполняется при сборке и создает новый образ. CMD выполняется, когда контейнер запущен, и не выполняет никаких операций во время сборки.

4.LABEL добавляет метаданные

LABEL используется для добавления метаданных к изображению. Метаданные указываются в виде пар ключ-значение:

Язык кода:javascript
копировать
LABEL = = = ...

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

Язык кода:javascript
копировать
LABEL version="1.0" описание="Это веб-сервер" by=«ИТ-расшифровка»

После указания, вы можете просмотреть его через Docker Inspect:

Язык кода:javascript
копировать
docker inspect /test
"Labels": {
    "version": "1.0",
    "description": «Это веб-сервер»,
    "by": «ИТ-расшифровка»
},

5.EXPOSE установить порт прослушивания

Установите порт прослушивания для построенного образа, чтобы контейнер прослушивал во время выполнения. Формат:

Язык кода:javascript
копировать
EXPOSE [...]
#Например: EXPOSE 22 80 8443

Примечание. Эта информация о команде служит декларацией.,并不встреча自动完成端口映射。при запускеконтейнерчас需要использовать-P,Docker主机встреча自动分配一个宿主机的临час端口转发到指定的端口;использовать-p(Обратите внимание на капитализацию),Вы можете указать, какой локальный порт хоста будет сопоставлен.

6.ENV устанавливает переменные среды

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

Язык кода:javascript
копировать
ENV  
ENV = =...

7.КОПИРОВАТЬ

Формат следующий:

Язык кода:javascript
копировать
COPY <исходный путь>... <целевой путь>
COPY ["<исходный путь1>",... "<целевой путь>"]

Скопируйте исходный адрес localhost (для Dock­er­file Относительный путь, файл или каталог каталога, в котором он расположен) до адреса назначения изображения. Если целевой путь не существует, он будет создан автоматически. При использовании локального каталога в качестве исходного рекомендуется использовать COPY.

8.ДОБАВИТЬ копию

Эта команда скопирует содержимое указанного исходного пути в путь назначения в контейнере. Формат и свойства инструкций ADD и COPY в основном одинаковы. Но некоторые функции добавляются на основе COPY. Например, исходным путем может быть URL-адрес. В этом случае механизм Docker попытается загрузить связанный файл по целевому пути.

При построении образа скопируйте файлы в контексте образа в формате:

Язык кода:javascript
копировать
ADD <исходный путь>... <целевой путь>
ADD ["<исходный путь>",... "<целевой путь>"]

9.ENTRYPOINT

ENTRYPOINT используется для настройки исполняемой программы для контейнера. То есть каждый раз, когда контейнер создается с использованием образа, программа, указанная в ENTRYPOINT, будет установлена ​​в качестве программы по умолчанию. ENTRYPOINT имеет две формы:

Язык кода:javascript
копировать
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINT и CMD очень похожи,Разница в том,проходитьdocker runосуществлять的命令不встреча覆盖 EN­TRY­POINT,иdocker run命令середина指定的任何параметр,都встреча被当做параметр再次传递给 EN­TRY­POINT。Dock­er­file Входить можно только одному EN­TRY­POINT Команда, если она указана несколько раз, предыдущие настройки будут перезаписаны и будет выполнена только последняя. EN­TRY­POINT инструкция.

docker runбегатьконтейнерчас指定的параметр都встреча被传递给 EN­TRY­POINT , и покроет CMD 命令指定的параметр。нравиться,осуществлятьdocker run <image> -dчас,-d Параметры будут переданы в точку входа.

ХОРОШОпроходитьdocker run --entrypoint重写 EN­TRY­POINT Точка входа. Например: вы можете указать исполнителя контейнера следующим образом:

Язык кода:javascript
копировать
ENTRYPOINT ["/usr/bin/nginx"]

Полный код сборки:

Язык кода:javascript
копировать
FROM ubuntu:16.04
MAINTAINER MoeWah "admin@mao.sh"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, Я контейнер \
   > /var/www/html/index.html
ENTRYPOINT ["/usr/sbin/nginx"]
EXPOSE 80

Используйте сборку Docker для создания образа и укажите его как moewah/​test:

Язык кода:javascript
копировать
docker build -t="moewah/test" .

После завершения сборки используйте moewah/​test для запуска контейнера:

Язык кода:javascript
копировать
docker run -i -t  moewah/test -g "daemon off;"

При запуске контейнера,насиспользовать Понятно-g "daemon off;",Этот параметр будет передан в ENTRYPOINT.,наконец вконтейнерсерединаосуществлять的命令为/usr/sbin/nginx -g "daemon off;"

10.VOLUME определяет анонимные тома.

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

Язык кода:javascript
копировать
VOLUME ["/data"]

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

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

11.WORKDIR указывает рабочий каталог.

WORKDIR используется для установки рабочего каталога внутри контейнера:

Язык кода:javascript
копировать
WORKDIR /path/to/workdir

После установки рабочего каталога через WORKDIR последующие команды в Dockerfile, такие как RUN, CMD, ENTRYPOINT, ADD, COPY и т. д., будут выполняться в этом каталоге. Например, используйте WORKDIR, чтобы установить рабочий каталог:

Язык кода:javascript
копировать
WORKDIR /aWORKDIR bWORKDIR cRUN pwd

В приведенном выше примере pwd 最终将встречасуществовать/a/b/c目录серединаосуществлять。существоватьиспользовать docker run бегатьконтейнерчас,Можетпроходить-wпараметр覆盖строитьчас所设置的工作目录。

12.USER указывает текущего пользователя

Укажите имя пользователя или UID при запуске контейнера, и последующие инструкции RUN и другие также будут использовать указанный идентификатор пользователя. Формат синтаксиса:

Язык кода:javascript
копировать
USER daemon

При использовании USER для указания пользователя вы можете использовать имя пользователя, UID или GID или их комбинацию. Ниже приведены юридические обозначения:

Язык кода:javascript
копировать
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

13.ARG

Укажите некоторые параметры в зеркалеиспользовать (например, информацию о номере версии и т. д.).,这些параметрсуществоватьосуществлятьdocker build命令час才以--build-arg=Формат передан。Формат синтаксиса:

Язык кода:javascript
копировать
ARG [=]
docker build --build-arg site=moewah.com -t moewah/test .

14.ONBUILD

При настройке текущего созданного зеркала в качестве Базазеркало другого зеркала,所осуществлять的创建操作инструкция.Формат синтаксиса:

Язык кода:javascript
копировать
ONBUILD [INSTRUCTION]

Например, Dockerfile использоватьнравиться下的内容创建Понятнозеркалоimage-A

Язык кода:javascript
копировать
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

Если на основе im­age-A При создании нового изображения новый Dock­er­file серединаиспользоватьFROM image-AОбозначение Базазеркало,встреча自动осуществлять ON­BUILD Содержание инструкции эквивалентно добавлению двух инструкций в конце:

Язык кода:javascript
копировать
FROM image-A
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

использовать ON­BUILD Инструкция к зеркалу,Рекомендуется указать это на этикетке.,例нравитьсяruby:1.9-onbuild

15.STOPSIGNAL

STOPSIGNAL используется для установки сигнала системного вызова, который будет отправлен для остановки контейнера:

Язык кода:javascript
копировать
STOPSIGNAL signal

Все сигналы должны иметь допустимые значения в таблице системных вызовов ядра, например: SIGKILL.

16.SHELL

Укажите другие командыиспользовать shell по умолчанию, когда shell тип.

Язык кода:javascript
копировать
SHELL ["executable", "parameters"]

Значение по умолчанию:["/bin/sh","-c"]

17.Пример Dockerfile

Создайте рабочую среду Nginx

Язык кода:javascript
копировать
# Обозначение Базазеркало
FROM sameersbn/ubuntu:14.04.20161014
# Информация для сопровождающего
MAINTAINER moewah "admin@mao.sh"
# Настройки
ЕНВ RTMP_VERSION=1.1.10 \
    NPS_VERSION=1.11.33.4 \
    LIBAV_VERSION=11.8 \
    NGINX_VERSION=1.10.1 \
    NGINX_USER=www-data \
    NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \
    NGINX_LOG_DIR=/var/log/nginx \
    NGINX_TEMP_DIR=/var/lib/nginx \
    NGINX_SETUP_DIR=/var/cache/nginx

# При установке переменной сборки она станет недействительной после создания зеркала.
ARG BUILD_LIBAV=false
ARG WITH_DEBUG=false
ARG WITH_PAGESPEED=true
ARG WITH_RTMP=true
# копировать локальные файлы в каталог контейнера
COPY setup/ ${NGINX_SETUP_DIR}/
RUN bash ${NGINX_SETUP_DIR}/install.sh
# скопировать локальный файл конфигурации в каталог контейнера
COPY nginx.conf /etc/nginx/nginx.conf
COPY entrypoint.sh /sbin/entrypoint.sh
# запустить команду
RUN chmod 755 /sbin/entrypoint.sh
# Разрешить указанные порты
EXPOSE 80/tcp 443/tcp 1935/tcp
# Укажите точку монтирования каталога веб-сайта
VOLUME ["${NGINX_SITECONF_DIR}"]
ENTRYPOINT ["/sbin/entrypoint.sh"]
CMD ["/usr/sbin/nginx"]

Создайте среду Tomcat

Язык кода:javascript
копировать
# Укажите Базазеркало на основе
FROM ubuntu:13.10
# Информация для сопровождающего
MAINTAINER moewah "admin@mao.sh"

# Командные операции зеркала
# Получите обновленный список ресурсов от APT
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
# Обновление программного обеспечения
RUN apt-get update

# Install curl
RUN apt-get -y install curl

# Install JDK 7
RUN cd /tmp &&  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz
RUN mkdir -p /usr/lib/jvm
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/

# Set Oracle JDK 7 as default Java
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300
# Настройте систему
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/

# Install tomcat7
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/

ENV CATALINA_HOME /opt/tomcat7
ENV PATH $PATH:$CATALINA_HOME/bin
# Скопируйте tomcat7.sh в каталог в контейнере.
ADD tomcat7.sh /etc/init.d/tomcat7
RUN chmod 755 /etc/init.d/tomcat7

# Expose ports.  Укажите открытые порты
EXPOSE 8080

# Define default command.
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out

tomcat7.shкомандный файл

Язык кода:javascript
копировать
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/
export TOMCAT_HOME=/opt/tomcat7

case $1 in
start)
  sh $TOMCAT_HOME/bin/startup.sh
;;
stop)
  sh $TOMCAT_HOME/bin/shutdown.sh
;;
restart)
  sh $TOMCAT_HOME/bin/shutdown.sh
  sh $TOMCAT_HOME/bin/startup.sh
;;
esac
exit 0

В конце написано: Принципы и рекомендации.

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

  • контейнер легкий. контейнер, изготовленный из зеркала, должен быть максимально легким.,能существовать足够短的час间内停止、разрушать、Восстановите и замените исходный контейнер.
  • использовать .gitignore. В большинстве случаев Dockerfile будет помещен в тот же каталог, что и файлы, необходимые для сборки. Чтобы повысить производительность сборки, его следует использовать. .gitignore для фильтрации ненужных файлов и каталогов.
  • Чтобы уменьшить размер зеркала,Уменьшить зависимость,Устанавливайте только необходимые пакеты.
  • Контейнер делает только одно. Разделение сложных приложений,разделен на несколько контейнеров,и不是所有东西都放существовать一个контейнер内бегать。нравиться一个 Python Web приложение, может потребоваться Server、DB、Cache、MQ、Log Подождите несколько контейнеров. Более радикальное утверждение: один process per container。
  • Уменьшите слои зеркала. Никаких множественных этикеток, ENV Ждите этикеток.
  • Аргументы для строк продолжения сортируются в алфавитном порядке, в частности используйтеapt-get install -y при установке пакета.
  • использоватьстроитькэш。нравиться果不想использоватькэш,Вы можете принудительно перегенерировать промежуточное зеркало, используя параметр использования --no-cache=true.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose