Как упоминалось в docker-compose run
(2015)
Команда, переданная путем запуска, переопределяет команду, определенную в конфигурации службы .
Например, если конфигурация веб-службы запускается с bash
, затем docker-compose run web python app.py
переопределяет ее с python app.py
.
Второе отличие заключается в том, что docker-compose run
команда не создает ни один из портов, указанных в конфигурации службы .
Это предотвращает конфликты портов с уже открытыми портами. Если вы хотите, чтобы порты службы были созданы и сопоставлены с хостом, укажите флаг --service-ports:
$ docker-compose run --service-ports web python manage.py shell
Поэтому, если у вас нет этих конкретных потребностей (переопределение команды или запуск только одного контейнера на разных портах) docker-compose up
(даже для одного контейнера) будет достаточно.
Не могли бы вы объяснить, почему или когда вы не хотите создавать порты? Вот почему или когда они могут конфликтовать с уже открытыми портами
Просто потому, что docker-compose run
он создан для выполнения одноразовых команд для ваших сервисов.
Это означает, что, если вы уже сделали это docker-compose up
, все ваши контейнеры уже работают на своих указанных портах из docker-compose.yml
.
Выполнение docker-compose run
на этом этапе (для выполнения одноразовой команды), если он уважает тот же порт, немедленно завершится ошибкой. Следовательно, по умолчанию эти порты не создаются.
Другой вариант использования (в справочнике по переменным среды Compose ):
Чтобы узнать, какие переменные среды доступны для службы, запустите docker-compose run SERVICE env
.
Самая последняя (2019+) версия этих команд включена docker/docker.github.io
:
docker-compose run
для выполнения команд для работающей службы иdocker-compose up
для создания новой службы.