gpt4 book ai didi

docker - 如何创建 Dockerfile 以便容器可以在不立即退出的情况下运行

转载 作者:行者123 更新时间:2023-12-02 19:02:49 45 4
gpt4 key购买 nike

像 MySQL 这样的官方 Docker 镜像可以这样运行:

docker run -d --name mysql_test mysql/mysql-server:8.0.13

它可以在后台无限期地运行。

我想尝试创建一个执行相同操作的图像,特别是 Flask 开发服务器(仅用于测试)。但我的容器立即退出。我的 Dockerfile 是这样的:
FROM debian:buster
ENV TERM xterm
RUN XXXX # some apt-get and Python installation stuffs
ENTRYPOINT [ "flask", "run", "--host", "0.0.0.0:5000" ]
EXPOSE 80
EXPOSE 5000
USER myuser
WORKDIR /home/myuser

但是,它一运行就立即退出。我还尝试将“bash”作为入口点,以确保它不是 Flask 配置问题并且它也退出了。

如何使它在容器中作为进程运行?

编辑

好的有人在下面发帖(但后来删除了),测试的命令是使用 tail -f /dev/null ,并且它确实无限期地运行。我还是不明白为什么 bash不能作为一个不存在的过程工作(是吗?)。但我的 flask 配置可能已关闭。

编辑 2

我看到在没有 -d 标志的情况下运行会打印出标准输出(或标准错误),以便我可以诊断问题。

最佳答案

让我们把事情弄清楚。
通常,容器在其入口点为 时立即退出。成功执行。
在你的情况下,如果不是 python 专家,这个 ENTRYPOINT [ "flask", "run", "--host", "0.0.0.0:5000" ]足以让容器保持活力。但我猜你有一些配置错误,由于该错误,容器在运行之前退出 flask命令。您可以通过运行 docker ps -a 来验证这一点。并检查退出代码(可能是 1)。
现在让我们讨论一下您编辑中的问题。
您误解的关键部分来自 -d旗帜。
您认为设置 bash 是对的因为入口点足以让容器保持事件状态但是 您需要附加到该外壳。
以分离模式运行时(-d),容器将执行 bash命令,但只要没有人连接到该外壳,它就会退出。此外,使用此标志会阻止您实时查看容器日志(但是您可以使用 docker logs container_id 进行调试),这在您处于设置的早期阶段时非常有用。因此,我建议仅在您确定一切都按预期工作时才使用此标志。
要附加到 bash shell 并使容器保持事件状态,您应该使用 -it标记,以便 bash shell 将附加到调用 docker run 的当前 shell命令。

-t : Allocate a pseudo-tty

-i : Keep STDIN open even if not attached


也请引用官方文档 foreground vs background模式。

关于docker - 如何创建 Dockerfile 以便容器可以在不立即退出的情况下运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771643/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com