Мне нужно ваше руководство по этому вопросу.
Я пытаюсь понять, почему docker compose run контейнер npm не запускается в стеке, а выталкивается наружу? Смотрите скриншот.
Поскольку у меня есть файл docker-compose.yml со всеми службами, служба npm предназначена для установки пакетов и запуска сервера разработки vite. И, конечно же, поскольку у меня нет ни команды, ни точки входа, указанной ни в файле компоновки, ни в самом файле докеров, контейнер npm завершает работу, как и должен.
Когда я запускаю docker compose run npm npm run dev, контейнер запуска npm поднимается над стеком docker-base. Почему это?
Спасибо, что пролили немного света.


Похоже, вы столкнулись с распространенной ситуацией при работе с Docker Compose, особенно при использовании команды docker compose run для выполнения одноразовых команд для сервисов, определенных в вашем docker-compose.yml.
Когда вы используете docker compose run для запуска службы, Docker Compose создает новый контейнер для этой команды, отдельный от контейнеров, которыми он управляет автоматически docker-compose up. Насколько я понимаю, такое поведение разработано специально и позволяет вам запускать одноразовые команды или задачи для разработки, отладки или администрирования, не мешая текущим работающим службам.
Команда docker compose run изолирует запущенную вами службу от служб, запускаемых с docker-compose up. По сути, он рассматривает команду run как специальный экземпляр, поэтому вы видите ее в отдельном списке.
При запуске службы с docker compose run она не обязательно учитывает зависимости, определенные в docker-compose.yml, если только это явно не указано с помощью флага --no-deps. Он также каждый раз создает новый контейнер, поэтому при многократном запуске команды вы увидите несколько записей.
Что касается выхода из сервисного контейнера npm, поскольку не существует длительного процесса, определенного командой или точкой входа (как вы упомянули), контейнер выйдет сразу после выполнения своей задачи. Это нормальное поведение, если основной процесс контейнера (в данном случае выполнение команд npm) завершается.
Если вы хотите, чтобы служба npm оставалась в рабочем состоянии и была частью основного стека, возможно, вам придется рассмотреть возможность определения для нее долговременного процесса в вашем docker-compose.yml. Что-то вроде:
npm:
image: node:latest
volumes:
- .:/app
working_dir: /app
command: npm run dev
Если вам просто нужно время от времени запускать команды и вы не возражаете против того, чтобы они были отдельными, ваш текущий подход подойдет. Однако ранее я использовал docker-compose exec для запуска команд в уже запущенном контейнере (запущенном docker-compose up), что иногда может быть более удобным и хранить все в одном стеке.
Это пример использования exec для запуска команды в уже работающей службе npm:
docker-compose exec npm npm run dev
Убедитесь, что ваша служба npm настроена на работу без завершающей команды, чтобы exec работал, например, используйте фиктивную команду, например tail -f /dev/null, чтобы контейнер работал бесконечно.
Надеюсь, это поможет объяснить ситуацию, но если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.
Всегда пожалуйста! Ах да, флаг сервисных портов имеет смысл. Рад, что мой взгляд оказался вам полезен.
Большое спасибо, что нашли время. И да, я знал об этой
tail -f /dev/nullхитрости. Не был уверен, что это то, что мне нужно. Но, как вы объяснили, и ваш личный опыт использования командыexec, я более чем рад ее использовать. Хитрость здесь также заключается в том, чтобы использовать --service-ports, когда вы действительно хотите, чтобы этот «новый» контейнер прослушивал и действовал как часть стека. Еще раз спасибо.