Структура Dockerfile и основные элементы

Слои в итоговом образе создают только инструкции FROMRUNCOPY, и 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>

От denerk

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *