Ответы:
Как упоминалось в 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 :
Я хотел бы отметить, что если вы используете Python с отладчиком pdb:
import pdb; pdb.set_trace()
Он не попадет в оболочку, если вы выполните свой скрипт, используя:
docker-compose up
Однако, если вы используете run, он, как и ожидалось, перейдет в отладчик:
docker-compose run
Есть ответ из докеров .
Обычно вы хотите
docker-compose up. Используйтеupдля запуска или перезапуска всех служб, определенных в файлеdocker-compose.yml. В «прикрепленном» режиме по умолчанию вы видите все журналы из всех контейнеров. В «отключенном» режиме (-d) Compose завершает работу после запуска контейнеров, но контейнеры продолжают работать в фоновом режиме.Команда
docker-compose runпредназначена для выполнения «разовых» или «специальных» задач. Для этого требуется имя службы, которую вы хотите запустить, и запускать контейнеры только для служб, от которых зависит запущенная служба. Используйтеrunдля запуска тестов или выполнения административных задач, таких как удаление или добавление данных в контейнер тома данных. Командаrunдействует так, какdocker run -tiбудто она открывает интерактивный терминал для контейнера и возвращает статус выхода, соответствующий статусу выхода процесса в контейнере.
docker-compose runдля выполнения команд для работающей службы иdocker-compose upдля создания новой службы.