如何在Node.js应用程序中调试Docker重新启动而不重新启动?

时间:2020-07-07 06:42:05

标签: node.js docker docker-compose

我有一个带有docker-compose这样的容器

services:
  app:
    build:
      context: app
    restart: always
version: '3.5'

它启动节点应用docker-compose run -d --name my-app app node myapp.js

使该应用运行至完成或抛出,然后目标是使Docker无限循环地重启它,而不考虑退出代码。我不确定为什么,但是它不会重新启动。

我该如何调试?我不知道节点正在发送什么退出代码,也不知道码头工人决定使用哪个退出代码重新启动。

我也在Mac上,尚未在Linux上进行测试。编辑:它确实在Linux上重新启动,没有其他Mac来查看行为是否仅与我的Mac隔离。

2 个答案:

答案 0 :(得分:1)

重要的是要理解以下两个概念:

  • 结束您的Node应用程序并不意味着您的容器已结束。您的容器从您的操作系统运行一个共享进程,而您的Node应用程序只是该进程的一个子进程。 (假设您的应用程序与Deamon一起运行)

  • restart表示“启动”策略-它永远不会终止并再次启动您的容器。

话虽如此,您需要的是一种可以真正从应用程序内部重新启动容器的方法。最好的方法是通过Docker运行状况检查:

https://docs.docker.com/engine/reference/builder/#healthcheck

或者,这是有关从应用程序内部重新启动容器的一些答案。

Stopping docker container from inside

答案 1 :(得分:0)

Github Issue开始似乎不尊重`--restart``,或者从@Charlie注释开始似乎在各个平台之间都不同。

docker-compose run命令用于运行“一次性”或“ adhoc” 任务。run命令的作用类似于docker run -ti,它打开了容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。

docker-compose run

如果它像docker run -it一样,那么我没有看到restart=always的选项,但是它应该遵循compose的“ restart`选项”。

Usage:
    run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...]
        SERVICE [COMMAND] [ARGS...]

Options:
    -d, --detach          Detached mode: Run container in the background, print
                          new container name.
    --name NAME           Assign a name to the container
    --entrypoint CMD      Override the entrypoint of the image.
    -e KEY=VAL            Set an environment variable (can be used multiple times)
    -l, --label KEY=VAL   Add or override a label (can be used multiple times)
    -u, --user=""         Run as specified username or uid
    --no-deps             Don't start linked services.
    --rm                  Remove container after run. Ignored in detached mode.
    -p, --publish=[]      Publish a container's port(s) to the host
    --service-ports       Run command with the service's ports enabled and mapped
                          to the host.
    --use-aliases         Use the service's network aliases in the network(s) the
                          container connects to.
    -v, --volume=[]       Bind mount a volume (default [])
    -T                    Disable pseudo-tty allocation. By default `docker-compose run`
                          allocates a TTY.
    -w, --workdir=""      Working directory inside the container