Docker составляет стек и отдельные контейнеры

Мне нужно ваше руководство по этому вопросу. Я пытаюсь понять, почему docker compose run контейнер npm не запускается в стеке, а выталкивается наружу? Смотрите скриншот.

Поскольку у меня есть файл docker-compose.yml со всеми службами, служба npm предназначена для установки пакетов и запуска сервера разработки vite. И, конечно же, поскольку у меня нет ни команды, ни точки входа, указанной ни в файле компоновки, ни в самом файле докеров, контейнер npm завершает работу, как и должен.

Когда я запускаю docker compose run npm npm run dev, контейнер запуска npm поднимается над стеком docker-base. Почему это?

Спасибо, что пролили немного света.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы столкнулись с распространенной ситуацией при работе с 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, когда вы действительно хотите, чтобы этот «новый» контейнер прослушивал и действовал как часть стека. Еще раз спасибо.

Mega Aleksandar 02.06.2024 20:13

Всегда пожалуйста! Ах да, флаг сервисных портов имеет смысл. Рад, что мой взгляд оказался вам полезен.

helpinghand 02.06.2024 21:37

Другие вопросы по теме