Docker 容器保持运行状态

问题描述 投票:0回答:3

我无法理解 docker 容器是如何保持运行的。据我所知,如果容器没有任何活动进程,它将自动关闭,而不受给定命令的影响。

这就是我指示我的

docker-compose.yml
执行此命令以使其保持活力的原因:

  gateway:
    build: .
    image: me/gateway
    container_name: gateway
    command: tail -F /dev/null <------
    #    restart: always
    ports:
      - "10091:10091"
    volumes:
      - ./logs:/root/logs
      - vendor:/root/vendor
      - .:/root
    env_file:
      - .env 

虽然我的

Dockerfile
做了以下事情:

FROM php:7-fpm-alpine

EXPOSE 10091

WORKDIR /root
COPY . .
COPY src/scripts/generateConfig.sh /usr/local/bin/generateConfig
RUN ["chmod", "+x", "/usr/local/bin/generateConfig"]

在这种情况下,容器保持运行状态,一切都很好。但是我想在容器启动后运行一个脚本,所以我在

Dockerfile
:

的末尾添加了额外的行
ENTRYPOINT ["generateConfig"]

命令运行后,容器自动停止。当我检查日志时没有错误,因为脚本按预期完成了工作。脚本负责无限期地运行棘轮网络套接字进程。

如何让脚本运行并同时保持我的容器运行?

docker docker-compose dockerfile docker-container
3个回答
0
投票

当你启动一个容器时,它会运行你在

ENTRYPOINT
CMD
中定义的命令。 这个命令通常会启动一个进程,只要这个进程在前台运行,容器就会继续运行。 如果您的进程在后台运行,容器将停止。 因此,如果您正在运行脚本,则需要确保它永不结束。 您可以通过在脚本末尾添加这样的行来简单地实现这一点:

tail -f <some log file> # keep listening on your application log file.

或者,您可以在 true 时添加一些:

while true; sleep 2; done 

希望对你有帮助


0
投票

我发现了问题。命令启动 web 套接字进程的脚本以这一行开头:

nohup php ${serviceProcess} >> /dev/null 2>&1 &

解决方案不是仅通过使用来抑制输出:

nohup php ${serviceProcess}

现在很好用


0
投票

快速回答

如果你的 docker run 命令看起来像这样

docker run yourimage

改成这样

docker run -dt --entrypoint bash yourimage

现在运行

docker ps
你应该看到它正在运行。

为什么你的容器没有保持运行?

Dockerfile 包含构建镜像的说明。通常有一个

ENTRYPOINT
指令(通常在 Dockerfile 的末尾)告诉图像启动时要做什么。如果缺少该指令(或者如果指令执行得非常快),容器将启动但很快就会停止,因为它没有被告知执行任何长时间运行的进程。

这就是为什么手动向

 docker run
命令提供指令(例如
entrypoint bash
)将使容器保持运行 - 你实际上是在说“打开 bash shell,之后不要做任何其他事情”,所以容器会这样做这就是让它运行的原因。

大多数时候,您可能想将入口点指令烘焙到 Dockerfile 中,它通常(但不总是)是启动应用程序服务器的指令。

© www.soinside.com 2019 - 2024. All rights reserved.