我无法理解 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"]
命令运行后,容器自动停止。当我检查日志时没有错误,因为脚本按预期完成了工作。脚本负责无限期地运行棘轮网络套接字进程。
如何让脚本运行并同时保持我的容器运行?
当你启动一个容器时,它会运行你在
ENTRYPOINT
或 CMD
中定义的命令。
这个命令通常会启动一个进程,只要这个进程在前台运行,容器就会继续运行。
如果您的进程在后台运行,容器将停止。
因此,如果您正在运行脚本,则需要确保它永不结束。
您可以通过在脚本末尾添加这样的行来简单地实现这一点:
tail -f <some log file> # keep listening on your application log file.
或者,您可以在 true 时添加一些:
while true; sleep 2; done
希望对你有帮助
我发现了问题。命令启动 web 套接字进程的脚本以这一行开头:
nohup php ${serviceProcess} >> /dev/null 2>&1 &
解决方案不是仅通过使用来抑制输出:
nohup php ${serviceProcess}
现在很好用
如果你的 docker run 命令看起来像这样
docker run yourimage
改成这样
docker run -dt --entrypoint bash yourimage
现在运行
docker ps
你应该看到它正在运行。
Dockerfile 包含构建镜像的说明。通常有一个
ENTRYPOINT
指令(通常在 Dockerfile 的末尾)告诉图像启动时要做什么。如果缺少该指令(或者如果指令执行得非常快),容器将启动但很快就会停止,因为它没有被告知执行任何长时间运行的进程。
这就是为什么手动向
docker run
命令提供指令(例如 entrypoint bash
)将使容器保持运行 - 你实际上是在说“打开 bash shell,之后不要做任何其他事情”,所以容器会这样做这就是让它运行的原因。
大多数时候,您可能想将入口点指令烘焙到 Dockerfile 中,它通常(但不总是)是启动应用程序服务器的指令。