Когда команда запуска становится частью проекта
Для разового теста удобно выполнить docker run. Но при повторном развёртывании важно не забыть каталог с данными, порт или переменную. В compose.yaml эти настройки разнесены по полям: их проще проверить, сохранить в Git и передать вместе с проектом.
Конвертер создаёт один сервис из одной команды. Он не считывает настройки работающих контейнеров, не меняет их состояние и не определяет зависимости между сервисами. Полученный файл нужно проверить в той среде, где он будет использоваться.
Как не подключить пустой том вместо существующего
Именованный том сохраняет исходное имя и объявляется с external: true. Это позволяет обратиться к существующему тому, а не создать новый с префиксом проекта Compose. Для новой установки заранее создайте том или уберите признак внешнего ресурса. Данные при преобразовании не копируются.
Относительные пути привязаны к каталогу файла Compose. Пользовательская сеть также считается внешней и должна существовать. Если сеть не указана, сохраняется network_mode: bridge. Удалите это поле, если хотите использовать сеть проекта Compose с обращением к сервисам по именам.
Порядок преобразования и проверки
Вставьте команду с docker run или docker container run. Сохраняйте кавычки и символы продолжения строк. Необязательное имя сервиса меняет ключ в services, но значение --name остаётся в container_name.
Прочитайте примечания, скачайте или скопируйте YAML и проверьте пути к каталогам и файлам. Выполните docker compose config. Постоянно работающий сервис можно запустить через docker compose up -d; для разовой задачи с --rm используется другой способ запуска.
Пример с Nginx: порты и перезапуск
Порт 8080 хоста направляется на порт 80 контейнера. Политика unless-stopped переносится в YAML, а -d остаётся выбором режима запуска Compose, а не полем сервиса.
docker run -d --name web -p 8080:80 \
--restart unless-stopped nginx:alpineservices:
web:
image: "nginx:alpine"
container_name: "web"
ports:
- "8080:80"
restart: "unless-stopped"
network_mode: "bridge"
Переменные оболочки нужно раскрыть заранее
Поддерживается синтаксис POSIX: кавычки, экранирование и продолжение строк. PowerShell, CMD, конвейеры, несколько команд и глобальные параметры Docker не поддерживаются. Замените переменные и $(pwd) конкретными значениями. Литеральный знак доллара защитите одинарными кавычками или экранированием; в Compose он сохраняется как $$.
Для --env-file используется format: raw, требующий Docker Compose 2.30.0 или новее. Содержимое файлов, образы и занятость портов не проверяются. Успешная проверка конфигурации ещё не гарантирует запуск приложения.
Соответствие параметров Docker полям Compose
| Параметр Docker | Поле Compose | Назначение |
|---|---|---|
IMAGE | image | Сохраняются образ и тег |
--name | container_name | Явно заданное имя контейнера |
-p, --publish | ports | Порты хоста и контейнера |
-e, --env | environment | Значения без присваивания берутся из среды запуска |
-v, --volume / --mount | volumes | Привязка каталогов, именованные и анонимные тома |
--network | networks / network_mode | Имя сети или сетевой режим |
--restart | restart | Политика перезапуска |
IMAGE [COMMAND] [ARG…] | command | Аргументы сохраняются списком |
Вопросы о переносе в Compose
Почему нет поля version?
Файл соответствует Compose Specification и начинается с services. Устаревшее поле version не добавляется. Для проверки используйте современную команду docker compose.
Чем заменить --rm?
Разовую задачу запускайте через docker compose run --rm --service-ports SERVICE, заменив SERVICE именем сервиса. Параметр --service-ports включает публикацию портов из файла.
Что будет с неподдерживаемым параметром?
Преобразование остановится. Например, --gpus, --link и некоторые расширенные параметры монтирования требуют ручной настройки. Они не исчезнут из конфигурации незаметно.
Можно ли объединить несколько команд?
Преобразуйте их отдельно, затем объедините определения сервисов. Общие тома, сети и зависимости нужно согласовать вручную.
Отправляются ли пароли на сервер?
Введённая команда обрабатывается в браузере и не загружается на сервер. Однако её значения остаются в полученном файле, поэтому проверьте его перед публикацией в репозитории.
Будет ли заменён работающий контейнер?
Само преобразование ничего не выполняет в Docker. Перед запуском Compose устраните конфликты с уже занятыми именами контейнеров и портами.
Официальная документация Docker: docker run · Compose · $$
