Відповіді:
Як згадувалося у 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на цьому етапі (для виконання одноразової команди), якщо воно поважало той самий порт, було б негайно негайно. Отже, створення цих портів за замовчуванням не створюється.
Інший випадок використання (у посиланні на змінні середовища )
Щоб побачити, які змінні середовища доступні для сервісу, запустіть
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 docs .
Як правило, ви хочете
docker-compose up. Використовуйтеupдля запуску або перезавантаження всіх служб, визначених у adocker-compose.yml. У режимі "додавання" за замовчуванням ви бачите всі журнали з усіх контейнерів. У режимі "від'єднаний" (-d) Compose виходить після запуску контейнерів, але контейнери продовжують працювати у фоновому режимі.
docker-compose runКоманда для запуску «одноразовий» або «AdHoc» завдання. Він вимагає назви служби, яку ви хочете запустити, і запускає лише контейнери для служб, від яких залежить запущена служба. Використовуйтеrunдля запуску тестів або виконання адміністративних завдань, таких як видалення або додавання даних до контейнера обсягу даних.runКоманда діє якdocker run -tiв тому , що вона відкриває інтерактивний термінал в контейнер і повертає статус виходу , відповідний статус завершення процесу в контейнері.
docker-compose runдля виконання команд проти запущеної служби таdocker-compose upнерестування нової служби.