Контейнеры и CI/CD
Справочник compose.yaml
Ключи файла compose.yaml с рабочими примерами и оговорками: чем depends_on отличается от ожидания готовности, почему проброшенный порт обходит файрвол и куда девается диск из-за логов.
32 ключа из Compose Specification. Ключ version сюда не входит: современный Compose определяет версию сам и на него ругается как на устаревший.
Показано 32 из 32 ключей.
Верхний уровень
Ключ version больше не нужен: современный Compose определяет версию сам и на version ругается как на устаревший.
services: web: image: nginx:1.27-alpine
services — Контейнеры приложения. Единственный обязательный раздел.
Синтаксис: services: имя: …
name: shop
name — Имя проекта: из него получаются префиксы контейнеров, сетей и томов.
Без него имя берётся из названия папки — переименовали папку, и Compose «потерял» контейнеры. · Синтаксис: name: строка
volumes: db-data:
volumes — Именованные тома — данные переживают пересоздание контейнера.
Синтаксис: volumes: имя:
networks: back: internal: true
networks — Свои сети. По умолчанию Compose и так создаёт общую сеть для всех сервисов.
internal: true — сеть без выхода наружу: контейнеры в ней видят друг друга, но не интернет. · Синтаксис: networks: имя:
secrets: db_password: file: ./db_password.txt
configs / secrets — Файлы, которые монтируются внутрь как /run/secrets/имя.
В отличие от environment, значение не видно в docker inspect и в логах. · Синтаксис: secrets: имя: file: путь
include: - ../common/compose.yaml
include — Подключить другой compose-файл целиком.
Синтаксис: include: - путь
Откуда берётся контейнер
image: postgres:17-alpine
image — Готовый образ из реестра.
Тег latest делает сборку невоспроизводимой: у вас и на сервере окажутся разные образы. · Синтаксис: image: образ[:тег]
build: context: . dockerfile: Dockerfile args: NODE_ENV: production target: runtime
build — Собрать образ из Dockerfile.
Синтаксис: build: путь | объект
pull_policy: always
pull_policy — Когда тянуть образ заново.
Синтаксис: pull_policy: always | missing | never | build
platform: linux/amd64
platform — Собрать или запустить под другую архитектуру.
Нужно на Apple Silicon, когда образа под arm64 не существует. · Синтаксис: platform: os/arch
Запуск и окружение
command: ["npm", "run", "start"]
command — Чем заменить CMD образа.
Списком надёжнее: строка уходит в оболочку, и кавычки с подстановками ведут себя непредсказуемо. · Синтаксис: command: строка | список
entrypoint: /usr/local/bin/docker-entrypoint.sh
entrypoint — Заменить ENTRYPOINT образа.
Синтаксис: entrypoint: строка | список
environment: TZ: Europe/Moscow DATABASE_URL: postgres://app@db:5432/shop
environment — Переменные окружения.
Секреты сюда класть не стоит: они видны в docker inspect и в выводе ps у многих процессов. · Синтаксис: environment: КЛЮЧ: значение
env_file: - .env - .env.local
env_file — Переменные из файла .env.
Файл читается Compose, а не оболочкой: кавычки остаются частью значения, а подстановок $VAR внутри нет. · Синтаксис: env_file: путь | список
user: "1000:1000"
user — От кого работает процесс внутри контейнера.
Синтаксис: user: uid[:gid]
working_dir: /app
working_dir — Рабочий каталог внутри контейнера.
Синтаксис: working_dir: путь
restart: unless-stopped
restart — Что делать, если контейнер упал.
always поднимет контейнер и после ручной остановки при перезапуске демона; unless-stopped — нет. · Синтаксис: restart: no | always | on-failure | unless-stopped
stop_grace_period: 30s
stop_grace_period — Сколько ждать после SIGTERM, прежде чем убить.
По умолчанию 10 секунд — базе этого может не хватить на корректное закрытие. · Синтаксис: stop_grace_period: длительность
Сеть и порты
ports: - "127.0.0.1:8080:80"
ports — Пробросить порт наружу.
Без адреса порт слушает на всех интерфейсах и обходит ufw: правило firewall его не закроет. · Синтаксис: ports: - "внешний:внутренний"
expose: - "5432"
expose — Открыть порт только для других контейнеров.
Синтаксис: expose: - порт
networks: - back
networks — В каких сетях состоит сервис.
Синтаксис: networks: - имя
extra_hosts: - "host.docker.internal:host-gateway"
extra_hosts — Дописать строки в /etc/hosts контейнера.
Синтаксис: extra_hosts: - "host:ip"
dns: - 1.1.1.1
dns — Свои DNS-серверы.
Синтаксис: dns: - адрес
Данные
volumes: - db-data:/var/lib/postgresql/data - ./config:/etc/app:ro
volumes — Монтирование тома или папки хоста.
Путь с точкой — папка хоста, имя без слеша — именованный том. Первое зависит от машины, второе переносимо. · Синтаксис: volumes: - источник:цель[:режим]
tmpfs: - /tmp
tmpfs — Каталог в оперативной памяти: быстро и не остаётся на диске.
Синтаксис: tmpfs: - путь
read_only: true tmpfs: - /tmp
read_only — Файловая система контейнера только на чтение.
Синтаксис: read_only: true
Здоровье и зависимости
healthcheck: test: ["CMD-SHELL", "pg_isready -U app"] interval: 10s timeout: 3s retries: 5 start_period: 30s
healthcheck — Как понять, что сервис действительно работает.
start_period — время на запуск, в течение которого неудачи не считаются: без него база успевает несколько раз «упасть». · Синтаксис: healthcheck: test: …
depends_on: db: condition: service_healthy
depends_on — Порядок запуска.
Простой список depends_on ждёт только запуска контейнера, а не готовности сервиса. Ждать готовности умеет только condition: service_healthy. · Синтаксис: depends_on: сервис: condition: …
Ресурсы и журналы
deploy: resources: limits: cpus: "1.5" memory: 512M
deploy.resources — Потолок по памяти и процессору.
В обычном docker compose up работают limits; reservations учитываются только в Swarm. · Синтаксис: deploy: resources: limits: …
logging: driver: json-file options: max-size: "10m" max-file: "3"
logging — Куда и сколько писать логи.
Без ограничения размера json-file растёт бесконечно — самая частая причина внезапно кончившегося диска. · Синтаксис: logging: driver: … options: …
ulimits: nofile: soft: 65535 hard: 65535
ulimits — Лимиты ядра для процессов контейнера.
Синтаксис: ulimits: nofile: …
profiles: - debug
profiles — Сервис запускается только с этим профилем.
Удобно для необязательных сервисов: adminer, mailhog, отладочных утилит. · Синтаксис: profiles: - имя