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

如何创建Dockerfile,以便容器可以在不立即退出的情况下运行,docker,dockerfile,Docker,Dockerfile,MySQL等Docker官方图像可以如下运行: docker run -d --name mysql_test mysql/mysql-server:8.0.13 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

MySQL等Docker官方图像可以如下运行:

docker run -d --name mysql_test mysql/mysql-server:8.0.13
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
它可以在后台无限期运行

我想尝试创建一个与此相同的映像,特别是一个Flask开发服务器(仅用于测试)。但我的集装箱马上就要出口了。我的Dockerfile如下所示:

docker run -d --name mysql_test mysql/mysql-server:8.0.13
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”作为入口点,以确保它不是烧瓶配置问题,并且它也退出了

如何使其作为容器中的进程运行

编辑

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

编辑2


我看到在没有-d标志的情况下运行会打印出stdout(或stderr),这样我就可以诊断问题了。

编辑的答案是:当do
docker运行bash时,它会直接调用bash并退出0,因为命令(bash)成功。Bash不是shell,而是命令

如果运行
docker run-it tail-f/dev/null
,然后运行docker exec-it/bin/bash。您将跳入shell,因为它是您运行的命令

Dockerfile没有可在后台持久运行的命令,在mysqls中,它运行mysqld,该命令在PID 0上启动服务器

当PID 0退出时,容器停止

由于命令的运行方式,您的入口点很可能无法启动,或者启动和退出


我会试着把你的入口点改成a,让我们把事情弄清楚

通常,一旦容器的入口点成功执行,容器就会退出

在您的情况下,如果不是python专家,这个
入口点[“flask”、“run”、“--host”、“0.0.0.0:5000”]
就足以使容器保持活动状态。但是我猜您有一些配置错误,由于该错误,容器在运行
flask
命令之前退出。您可以通过运行
docker ps-a
并检查退出代码(可能是1)来验证这一点

现在让我们讨论一下编辑中的问题

误解的关键部分来自
-d
标志

您认为将
bash
设置为entrypoint就足以使容器保持活动是正确的,但是您需要附加到该shell

在分离模式(
-d
)下运行时,容器将执行
bash
命令,但一旦没有人连接到该shell,它就会退出。此外,使用此标志将阻止您查看容器日志(但是您可以使用
docker logs container_id
进行调试),这在设置的早期阶段非常有用。因此,我建议仅当您确信一切都按预期工作时才使用此标志

要附加到bashshell并使容器保持活动状态,您应该使用
-it
标志,以便调用
docker run
命令将bashshell附加到当前shell

-t:分配一个伪tty

-i:即使未连接,也保持标准DIN打开


还请查阅有关模式的官方文档。

为什么bash不是shell的可能副本?谢谢!我的烧瓶配置确实存在一些问题,这解释了bash和分离模式的混乱。