【问题标题】:Docker container exits immediately upon invocationDocker 容器在调用时立即退出
【发布时间】:2019-02-15 18:59:14
【问题描述】:

我使用的是 docker 版本 18.09.0。图像构建没有错误。从映像创建容器后,即使我使用 -it 选项,容器也会立即运行并以退出状态 0 退出。这是 Dockerfile。

FROM node:8.15-alpine

WORKDIR /usr/src/app

COPY package*.json ./
COPY middleware middleware
COPY hfc-key-store hfc-key-store
COPY app.js ./

RUN apk --no-cache --virtual build-dependencies add \
    python \
    make \
    g++ \
    && npm install \
    && npm install -g forever

ENTRYPOINT ["forever", "start", "-l", "/logsBackEnd.txt", "--spinSleepTime", "10000", "app.js"]

构建镜像的命令:

docker image build -t nid-api:1.0 .

运行容器的命令:

docker run -it  nid-api:1.0

【问题讨论】:

  • 尝试查看日志docker logs --tail 500 CONTAINER这是资源docs.docker.com/engine/reference/commandline/logs
  • LOGS:: warn: --minUptime 未设置。默认为:1000 毫秒信息:永远处理文件:app.js
  • 我不会使用工具来管理容器内的流程生命周期。只需将主容器进程设为./app.js一旦你的程序工作而不是之前,使用docker run --restart option让Docker为你做这件事。

标签: docker dockerfile


【解决方案1】:

您需要使用 -d 以分离模式运行

我能想到容器退出的两个原因。

  1. 如果容器内没有运行服务
  2. 如果服务正在运行并且 docker 正在运行而没有任何分离选项。

第一种情况似乎与您的错误更相关。但始终以分离模式运行容器。默认情况下,新版本的 docker 总是以分离模式运行

也可以试试下面的。

Docker container will automatically stop after "docker run -d"

【讨论】:

  • 为什么?那会有什么不同?
  • 我不认为这可能是原因。分离模式意味着容器应该作为守护进程运行。如果没有 -d 选项,它应该运行。检查日志可能会提供更多相关信息。
  • @UlrichDohou 是的。
【解决方案2】:

forever 在 docker 容器内作为守护进程运行,这可能是导致容器立即退出的原因。

您可以尝试使用dumb-init 启动在 docker 容器中运行的任何进程,以便正确处理退出信号。

dumb-init 使您可以简单地在命令前加上dumb-init。它充当 PID 1 并立即将您的命令作为子进程生成,注意在收到信号时正确处理和转发信号。

dumb-init 作为 PID 1 运行,就像一个简单的 init 系统。它启动一个进程,然后将所有接收到的信号代理到以该子进程为根的会话。

由于您的实际进程不再是 PID 1,因此当它接收到来自dumb-init 的信号时,将应用默认信号处理程序,并且您的进程将按照您的预期运行。如果你的进程死掉了,dumb-init 也会死掉,注意清理任何其他可能仍然存在的进程。

【讨论】: