Ответы:
Как упоминалось в 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
для создания новой службы.