На главную

Контейнеры и 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: - имя