Что поддерживается
Порты, тома (-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 продолжили работать.
