Что делать: docker-compose up или run?

129

Есть ли причина использовать runдля запуска docker-compose.ymlфайла или просто использовать up?

Я понимаю, что runможно запустить конкретный контейнер, но я имею в виду случай, когда вы используете его без указания контейнера, чтобы он запускал все ваши yml-контейнеры.

Раифа
источник

Ответы:

141

Как упоминалось в 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 :

VonC
источник
27

Я хотел бы отметить, что если вы используете Python с отладчиком pdb:

import pdb; pdb.set_trace()

Он не попадет в оболочку, если вы выполните свой скрипт, используя:

docker-compose up

Однако, если вы используете run, он, как и ожидалось, перейдет в отладчик:

docker-compose run
quickinsights
источник
7

Есть ответ из докеров .

Обычно вы хотите docker-compose up. Используйте upдля запуска или перезапуска всех служб, определенных в файле docker-compose.yml. В «прикрепленном» режиме по умолчанию вы видите все журналы из всех контейнеров. В «отключенном» режиме (-d ) Compose завершает работу после запуска контейнеров, но контейнеры продолжают работать в фоновом режиме.

Команда docker-compose runпредназначена для выполнения «разовых» или «специальных» задач. Для этого требуется имя службы, которую вы хотите запустить, и запускать контейнеры только для служб, от которых зависит запущенная служба. Используйте run для запуска тестов или выполнения административных задач, таких как удаление или добавление данных в контейнер тома данных. Команда runдействует так, как docker run -tiбудто она открывает интерактивный терминал для контейнера и возвращает статус выхода, соответствующий статусу выхода процесса в контейнере.

сойка
источник
1
Это должен быть принятый ответ. В основном используется docker-compose runдля выполнения команд для работающей службы и docker-compose upдля создания новой службы.
goonerify