Вставьте команду docker run и получите готовое к использованию описание сервиса Compose: порты, тома, окружение, сети, проверка работоспособности и политика перезапуска — преобразование выполняется в вашем браузере.
Превратите длинную команду docker run в файл Compose, который можно закоммитить. Вставьте команду точно так же, как вы бы её набирали, включая переносы строк. Флаги, не имеющие аналога в Compose, перечисляются как примечания, а не удаляются молча.
Примечания к преобразованию
От разовой команды к воспроизводимому файлу
Почему преобразование не чисто механическое
Команда docker run и сервис Compose описывают один и тот же контейнер, но отвечают на разные вопросы. Команда говорит, что делать прямо сейчас. Файл говорит, что должно быть верно всякий раз, когда сервис запущен. Большинство флагов чисто переносятся, а те, что не переносятся, почти всегда описывают само действие запуска, а не сам контейнер.
Яснее всего это видно на примере отсоединённого режима. Флаг -d говорит демону не удерживать ваш терминал — это свойство конкретного вызова, а не сервиса. В Compose тот же смысл выражается в командной строке через docker compose up -d, поэтому флаг просто исчезает из файла. То же самое относится к --rm, который просит очистку после конкретного прогона; аналог в Compose — запуск docker compose down по завершении.
Интерактивные флаги занимают промежуточное положение. И -i, и -t имеют ключи в Compose — stdin_open и tty, — поскольку удержание оболочки может быть настоящим свойством сервиса. Они преобразуются, а не отбрасываются, хотя большинству долго работающих сервисов они не нужны.
На кавычках преобразования и ломаются
Самая частая причина неработающего преобразования — оболочечная кавычка, потерянная ещё до того, как команда была вставлена. Возьмём проверку работоспособности: вся команда проверки должна прийти как один аргумент, поэтому она заключена в кавычки в командной строке. Вставьте без кавычек — и слова станут отдельными аргументами, имя образа прочитается из неверной позиции, а результат будет бессмысленным.
Конвертер разбивает входные данные так же, как оболочка: учитывает одинарные кавычки, двойные кавычки, экранирование обратным слэшем и переносы через обратный слэш и перевод строки, поэтому команда, скопированная прямо из скрипта, сохраняет свою структуру. Затем он заново заключает значения в кавычки при выводе по правилам YAML — это важнее, чем кажется. Сопоставление портов вроде 8080:80 должно быть в кавычках в YAML, потому что незаключённая пара через двоеточие неоднозначна, и старые парсеры исторически читали значения вроде 22:00 как шестидесятеричное число.
Сети и то, чего файл не может знать
Работа с сетями — единственное место, где точное преобразование всё равно требует от вас решения. Если команда присоединяется к host, none или bridge, это режим, и он становится network_mode. Любое другое имя относится к уже существующей сети, поэтому сервис получает запись networks, а файл объявляет эту сеть внешней (external).
Это объявление — утверждение о вашем окружении: оно говорит, что сеть управляется вне этого файла. Если вы хотите, чтобы Compose создал сеть и владел ею, удалите флаг external, и пусть она определяется обычным образом. Конвертер не может угадать, что вы хотите, потому что исходная команда лишь доказывает, что сеть существовала в момент её запуска.
Та же осторожность относится к монтированиям bind. Путь вроде /srv/site работает на машине, где писалась команда, и больше нигде. Как только сервис попадает в файл, который коммитят и делят, относительные пути или именованные тома обычно — лучший выбор.
Часто задаваемые вопросы
Почему флаг -d исчез из результата?
Detach описывает, как вы запускаете контейнер, а не что он собой представляет. В Compose тот же смысл вы выражаете командой docker compose up -d, поэтому ему не место в файле.
Можно ли вставить многострочную команду с обратными слэшами?
Да. Переносы через обратный слэш и перевод строки объединяются перед разбором, поэтому можно скопировать команду прямо из shell-скрипта или документации без переформатирования.
Почему мои порты заключены в кавычки?
YAML считает незаключённую пару через двоеточие неоднозначной, а некоторые парсеры читают значения вроде 22:00 как число. Заключение сопоставлений портов в кавычки — документированный способ сохранить их точно.
Что означает external: true у сгенерированной сети?
Это говорит Compose, что сеть уже существует и не должна создаваться или удаляться этим файлом. Если вы хотите, чтобы Compose сам управлял сетью, удалите этот флаг.
Неподдерживаемые флаги удаляются молча?
Нет. Всё, что конвертер не может сопоставить, перечисляется в примечаниях к преобразованию, чтобы вы могли решить, что с этим делать, а не обнаруживать пропуск позже.
Загружается ли моя команда куда-либо?
Нет. Разбор и генерация YAML выполняются в вашем браузере на собственном коде, поэтому команда никогда не покидает страницу.