Слои в итоговом образе создают только инструкции FROM, RUN, COPY, и ADD. Другие инструкции что-то настраивают, описывают метаданные, или сообщают Docker о том, что во время выполнения контейнера нужно что-то сделать, например — открыть какой-то порт или выполнить какую-то команду.
FROM
FROM <базовый образ:Версия> — ПЕРВЫЙ СЛОЙ — указываем базовый образ. Если не указана версия, то берется с тегом latest.
FROM openjdk:8-alpine
FROM debian:sid-slim
FROM alpine:latest
Несколько инструкций FROM в одном Dockerfile может быть при multi-stage сборке.
LABEL (не обязательно)
LABEL — указываем метаданные
LABEL <key>=<value> <key>=<value> <key>=<value> …
LABEL org.label-schema.name=»kafka» \
org.label-schema.description=»Apache Kafka» \
org.label-schema.build-date=»${build_date}» \
org.label-schema.vcs-url=»https://github.com/wurstmeister/kafka-docker» \
maintainer=»wurstmeister»
LABEL maintainer=»NGINX Docker Maintainers <docker-maint@nginx.com>»
WORKDIR
Команда WORKDIR задает рабочий каталог, относительно которого выполняются все действия во время формирования образа и при входе в контейнер
WORKDIR /app
RUN
RUN выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
Не имеет смысла в инструкциях выполнять команды ничего не сохраняющие после своего выполнения. То есть после выполнения обязательно должен быть результат.
RUN —mount=type=cache,target=/var/lib/apt/,sharing=locked \
set -eux && \
echo «#!/bin/sh\nexit 101» > /usr/sbin/policy-rc.d && \
INSTALL_PKGS=»bash \
ca-certificates \
chromium \
chromium-sandbox» && \
INSTALL_TEMP_PKGS=»gnupg» && \
apt-get -y update
ENV
ENV — устанавливает постоянные переменные среды
COPY
COPY — копирует в контейнер файлы и папки
COPY <откуда> <куда>
COPY ./supervisor-salt.conf /etc/supervisor/conf.d/
ADD
ADD — тоже копирует файлы в образ, но может это делать из удаленных источников
ADD ./supervisor-salt.conf /etc/supervisor/conf.d/
ADD https://raw.githubusercontent.com/discdiver/pachy-vid/master/sample_vids/vid1.mp4 /my_app_directory
EXPOSE
EXPOSE — информирование пользователя о том, что контейнер прослушивает указанные порты. Но это НЕ проброс портов. Проброс портов указывается в команде вызова контейнера с помощью -p.
EXPOSE 80 2022
docker run -p 80:80 -p 2022:2022 …
Инструкция указывается ближе к концу файла
ENTRYPOINT
CMD
CMD — команда, которую нужно выполнить при запуске контейнера. Результаты выполнения этой команды не добавляются в образ во время его сборки.
VOLUME
FROM python:3.7.2-alpine3.8
LABEL maintainer="jeffmshale@gmail.com"
# Устанавливаем зависимости
RUN apk add --update git
# Задаём текущую рабочую директорию
WORKDIR /usr/src/my_app_directory
# Копируем код из локального контекста в рабочую директорию образа
COPY . .
# Задаём значение по умолчанию для переменной
ARG my_var=my_default_value
# Настраиваем команду, которая должна быть запущена в контейнере во время его выполнения
ENTRYPOINT ["python", "./app/my_script.py", "my_var"]
# Открываем порты
EXPOSE 8000
# Создаём том для хранения данных
VOLUME /my_volume
________________________________________________________________
# Комментарий
ИНСТРУКЦИЯ аргументы
# Основные
# FROM - родительский образ
FROM <image>[:<tag>] [AS <name>]
# пример
FROM node:12-alpine AS build
# WORKDIR - установка рабочей директории для инструкций RUN, CMD, ENTRYPOINT, COPY и ADD
WORKDIR /path/to/dir
# пример
WORKDIR /app
# COPY - копирование новых файлов или директорий из <src>
# и их добавление в файловую систему образа по адресу, указанному в <dest>
COPY <src> <dest>
COPY ["<src>", "<dest>"]
# пример
COPY package.* yarn.lock ./
# или
COPY . .
# ADD, в отличие от COPY, позволяет копировать удаленные файлы,
# а также автоматически распаковывает сжатые (identity, gzip, bzip2 или xz) локальные файлы
# ADD - копирование новых файлов, директорий или удаленного (!) файла из <src>
# и их добавление в файловую систему образа по адресу, указанному в <dest>
ADD <src> <dest>
ADD ["<src>", "<dest>"]
# пример
ADD some.txt some_dir/ # <WORKING_DIR>/some_dir/
# RUN - выполнение команды в новом слое на основе текущего образа и фиксация результата
RUN <command>
# или
RUN ["executable", "arg1", "arg2"] # Кавычки должны быть двойными
# пример
RUN npm install
# CMD - предоставление дефолтных значений исполняемому контейнеру
CMD ["executable", "arg1", "arg2"]
# или если данной инструкции предшествует инструкция ENTRYPOINT
CMD ["arg1", "arg2"]
# или
CMD command arg1 arg2
# пример
CMD [ "node", "/app/src/index.js" ]
# RUN выполняет команду и фиксирует результат,
# CMD ничего не выполняет во время сборки, а определяет команду для образа
# (!) выполняется только одна (последняя) инструкция CMD
# ENTRYPOINT - настройка исполняемого контейнера
ENTRYPOINT ["executable", "arg1", "arg2"]
ENTRYPOINT command arg1 arg2
# пример
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
# docker run -it --rm --name test top -H
# top -b -H
# разница между ENTRYPOINT и CMD:
# https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact
# https://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile
# переменные
# ${var} или $var
# пример
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /qux # COPY $FOO /qux
# Другие
# LABEL - добавление метаданных к образу
LABEL <key>=<value>
# пример
LABEL version="1.0"
# EXPOSE - информация о сетевом порте, прослушиваемом контейнером во время выполнения
EXPOSE <port> | <port>/<protocol>
# пример
EXPOSE 3000
# ENV - установка переменных среды окружения
ENV <key>=<value>
# пример
ENV MY_NAME="No Name"
# VOLUME - создание точки монтирования
VOLUME ["/var/log"]
VOLUME /var/log
# USER - установка пользователя для использования при запуске контейнера
# в любых инструкциях RUN, CMD и ENTRYPOINT
USER <user>[:<group>]
USER <UID>[:<GID>]
# ARG - определение переменной, которая может быть передана через командную строку при
# выполнении команды `docker build` с помощью флага `--build-arg <name>=<value>`
ARG <name>[=<default value>]
# ONBUILD - добавление в образ триггера, запускаемого при использовании
# данного образа в качестве основы для другой сборки
ONBUILD <INSTRUCTION>