Docker compose - запустить оболочку и приложение внутри оболочки - PullRequest
0 голосов
/ 09 октября 2018

Я использую docker compose для запуска моего приложения в dev.environment.

version: '3.4'
services:
  web:
    build:
      context: .
      target: base
    ports:
     - "5000:5000"
    stdin_open: true
    tty: true 
    volumes:
     - ./src:/src
    command: node src/main/server/index.js

Composer запускает контейнер, и я вижу выходные данные журналов из приложения узла.Когда я нажимаю CTR-C - контейнер останавливается и мое приложение также останавливается.

Я хотел бы, чтобы мое приложение было остановлено, когда я нажимаю CTRL-C вместо целого контейнера.

То же поведение при запуске приложения в оболочке Windows CMD или Linux.Например, чтобы перезапустить приложение - нажмите CTRL-C, повторите команду запуска (node src/main/server/index.js, нажав верхнюю клавишу со стрелкой), и нажмите ввод.

Я думал, что мог бы использовать что-то подобное, но это не работает.

command: bash -c "node src/main/server/index.js

Я знаю, что могу использовать приведенную ниже команду для достижения ожидаемого поведения:

  • docker-compose up -d (запуск в отдельном режиме)
  • docker-compose exec web bash (запуск интерактивной оболочки)
  • node src/main/server/index.js (запуск узла вручную)

Номожет быть, есть способ запустить bash интерактивный bash и запустить приложение в bash с помощью команды singe docker-compose up?

1 Ответ

0 голосов
/ 09 октября 2018

Docker запускает основной процесс в своих контейнерах, поэтому остановка основного процесса также остановит контейнер.

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

Отвечая на ваш вопрос, вы можете «перехватить» контейнер в основном процессе, а затем просто взломать контейнер и выполнить запуск приложения.

Для того, чтобы перехватитьконтейнер, просто измените docker-compose command на:

command: while true; do sleep 1; done;

Чтобы войти в интерактивный bash в контейнере:

docker exec -it <CONTAINER-ID> bash

И затем вы можете запустить или остановитьприложение узла.

Кажется, что проблема, с которой вы сталкиваетесь, заключается в контейнере, требующем много времени для запуска, вам, вероятно, следует переупорядочить ваш Dockerfile, чтобы предотвратить повторную загрузку всех зависимостей (или другого длинного процесса) при каждом изменении файла.

Вы должны поместить свою команду COPY после всех команд, которые должны сохраняться в разных сборках, и использовать преимущества наложения изображений докера.

Если вам нужна функция «горячей перезагрузки», вы можете исследовать горячую перезагрузку Webpack.Вам потребуется привязать том хоста к рабочему каталогу контейнера, чтобы веб-пакет правильно просматривал файлы и перезагружал приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...