如何创建Dockerfile,以便容器可以在不立即退出的情况下运行
MySQL等Docker官方图像可以如下运行:如何创建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
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和分离模式的混乱。