Перейти к содержимому
RunStack
docker run ↔ Compose

Конвертер docker run ⇄ docker compose

Вставьте одну или несколько команд docker run — получите compose.yaml. Или наоборот. Что не переносится, показано отдельно.

ПриватностьКонвертация выполняется в браузере: команды и переменные окружения не отправляются на сервер.

compose.yamlсервисов: 2

services:
  app:
    image: ghcr.io/example/app:1.4.2
    container_name: app
    restart: unless-stopped
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://app:secret@db:5432/app
    ports:
      - "8080:3000"
    volumes:
      - app_uploads:/app/uploads
    networks:
      - backend
    healthcheck:
      test:
        - CMD-SHELL
        - wget -qO- http://localhost:3000/health || exit 1
      interval: 30s
    mem_limit: 512m
    cpus: 1
  db:
    image: postgres:16-alpine
    container_name: db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: app
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend
volumes:
  app_uploads: {}
  pgdata: {}
networks:
  backend:
    external: true

Что не перенеслось или требует внимания

  • networksПользовательские сети объявлены как external: true — они должны существовать (docker network create). Уберите external, если сеть должна создавать сама Compose.

Что поддерживается

Порты, тома (-v и --mount: bind, volume, tmpfs), переменные и --env-file, --restart, сети с алиасами и фиксированным IP, healthcheck, логирование, лимиты памяти и CPU, --gpus, ulimit, sysctl, capabilities, устройства, --entrypoint и команда после образа. Именованные тома попадают в секцию volumes, пользовательские сети — в networks. Ключ version не добавляется: в Compose v2 он устарел.

После конвертации

Проверьте результат командой docker compose config — она покажет итоговую конфигурацию с подставленными переменными. Пароли из -e лучше перенести в файл .env рядом с compose.yaml и сослаться на них как ${DB_PASSWORD}, а сам .env не коммитить.

Частые вопросы

Какие флаги docker run не переносятся?

Те, у которых нет аналога в Compose: --rm, -P (--publish-all), --cidfile, --sig-proxy, --label-file и т. п. Они перечислены под результатом. Флаг -d не нужен: docker compose up -d запускает сервисы в фоне.

Почему сети помечены external: true?

Если в docker run указана своя сеть (--network backend), она уже существует и создана вручную. Compose с external: true подключится к ней, а не создаст новую с префиксом проекта. Уберите external, если сеть должна принадлежать проекту.

Что с переменными вида $HOME и паролями с $?

Переменные из двойных кавычек или без кавычек остаются переменными — Compose подставит их из окружения или файла .env. Знак $, который в shell был литералом (в одинарных кавычках или экранирован), записывается как $$, чтобы Compose его не интерпретировал.

Почему обратная конвертация создаёт сеть app_default?

Compose кладёт сервисы в общую сеть проекта, где они видят друг друга по имени. В docker run по умолчанию сеть bridge без DNS по именам, поэтому для нескольких сервисов добавляется docker network create и --network, чтобы связи вроде db:5432 продолжили работать.