Docker compose-在shell内运行shell和应用程序

时间:2018-10-08 21:32:05

标签: docker docker-compose

我正在使用docker compose在dev中运行我的应用程序。环境。

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 Shell中运行应用程序时,行为相同。例如,要重新启动应用程序,请按CTRL-C,重复启动命令(按顶部箭头键{node src/main/server/index.js),然后按Enter。

我当时想我可以使用类似的东西,但是它不起作用。

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

我知道我可以使用以下命令来实现预期的行为:

  • docker-compose up -d(以分离模式启动)
  • docker-compose exec web bash(运行交互式外壳)
  • node src/main/server/index.js(手动启动节点)

但是也许有一种方法可以使用singe命令docker-compose up启动bash交互式bash并在bash中运行应用程序?

1 个答案:

答案 0 :(得分:1)

Docker在其容器中运行一个主进程,因此,停止主进程也将停止该容器。

我将尝试回答您的问题,但是我不认为您应该在开发环境中那样工作。

回答您的问题,您可以在一个主要过程中“捕获”容器,然后将其扑向该容器并执行应用程序启动。

为了捕获容器,只需将docker-compose root.Child("users").Child("email").SetRawJsonValueAsync(json); 更改为:

command

要进入容器中的交互式bash:

command: while true; do sleep 1; done;

然后您可以启动或停止节点应用程序。

您似乎面临的问题是容器需要花费很多时间来启动,您可能应该对Dockerfile进行重新排序,以防止每次文件更改时重新下载所有依赖项(或其他漫长的过程)。

您应该将docker exec -it <CONTAINER-ID> bash 命令放在所有应在所有版本中保留的命令之后,并利用docker的图像分层。

如果需要“热重装”功能,则可以研究Webpack热重装。 您需要将主机卷绑定到容器的工作目录,以使webpack正确监视文件并重新加载应用程序。