如何在node.js应用程序中调试docker restart而不是重新启动?

如何在node.js应用程序中调试docker restart而不是重新启动?,node.js,docker,docker-compose,Node.js,Docker,Docker Compose,我有一个容器,上面有这样一个docker组件 services: app: build: context: app restart: always version: '3.5' 它启动一个节点应用程序docker compose run-d——将我的应用程序命名为node myapp.js 应用程序要么运行到完成,要么抛出,然后目标是让docker在无限循环中重新启动它,而不管退出代码是什么。我不确定为什么,但它没有重新启动 我如何调试这个?我不知道退出代码节点

我有一个容器,上面有这样一个docker组件

services:
  app:
    build:
      context: app
    restart: always
version: '3.5'
它启动一个节点应用程序
docker compose run-d——将我的应用程序命名为node myapp.js

应用程序要么运行到完成,要么抛出,然后目标是让docker在无限循环中重新启动它,而不管退出代码是什么。我不确定为什么,但它没有重新启动

我如何调试这个?我不知道退出代码节点正在发送什么,也不知道docker使用哪个退出代码来决定是否重新启动

我也在mac上,还没有在linux上测试过。编辑:它确实在linux上重新启动,不需要另一台mac电脑来查看该行为是否仅限于我的mac电脑。

From似乎不尊重`--restart`,或者从@Charlie注释来看,它的行为似乎因平台而异

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

另外,如果它像
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

理解以下两个概念很重要:

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

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

话虽如此,您需要的是一种从应用程序中真正重新启动容器的方法。最好的方法是通过Docker healthchecks:

或者,下面是一些关于从应用程序中重新启动容器的答案


很有趣,因为我刚刚在linux服务器上测试了同一个应用程序,它确实重新启动了。但仍然没有在我的mac上重新启动。如果我在mac上检查容器,重启策略为空,但在linux上为“始终”。我在这两个地方使用完全相同的代码。那么它在linux中工作吗?从github问题来看,似乎不尊重
——重启
?是的,它似乎可以工作,我在linux上使用这个配置已经很长时间了,因此我不明白为什么它不能在我的mac上工作。我没有使用
--restart
标志,restart设置在docker-compose.yml中,看起来它尊重它。它确实会被
--rm
标志禁用,但我不使用它。我明白了,谢谢澄清,我会根据您的评论更新我的答案。正如我在OP中提到的,节点应用程序会终止,从而停止容器,然后容器会重新启动,但它不会。但我在linux上进行了测试,它确实重新启动了。该行为似乎仅在mac上发生,或者出于任何原因仅在我的mac上发生。因此,您的意思是您有代码在应用程序中重新启动容器?不,docker重新启动策略正在重新启动应用程序。我的应用程序没有重启功能。容器停止,然后重新启动。容器状态时间也会更新。我认为重启策略适用于运行deamon的应用程序。请看这里的第一个项目: