在流程执行后以分离模式启动的Docker容器停止

Dum*_*utu 5 linux docker

我使用以下命令以分离模式创建我的Docker容器:

docker run [OPTIONS] --name="my_image" -d container_name /bin/bash -c "/opt/init.sh"
Run Code Online (Sandbox Code Playgroud)

所以我需要在创建的容器上执行“ /opt/init.sh”。我看到的是,脚本执行完后容器已停止。

如何在创建容器时通过脚本/服务执行来使容器保持启动状态?

Gra*_* Li 5

有两种运行docker容器的模式

  1. 分离模式-此模式下您将执行命令,并在命令完成后终止容器
  2. 前景模式-此模式运行bash shell,但在退出shell后也会终止容器

您需要的是背景模式。这在参数中没有给出,但是有很多方法可以做到这一点。

  1. 在分离模式下运行无限命令,因此该命令永不结束,并且容器永不停止。我通常使用“ tail -f / dev / null”只是因为它的重量很轻并且大多数Linux映像中都存在/ dev / null。

docker run -d --name =名称容器尾巴-f / dev / null

然后,您可以像这样扑向正在运行的容器:

docker exec -it名称/ bin / bash -l

如果使用-l参数,它将以登录方式登录,该方式将像普通的bash登录一样执行.bashrc。否则,您需要手动重新进行内部打击

  1. 入口点-您可以创建任何sh脚本,例如/entrypoint.sh。在entrypoint.sh中,您也可以运行任何永无止境的脚本

#!/ bin / sh

#/ entrypoint.sh

服务mysql重启

...

tail -f / dev / null <-这永远不会结束

保存此entrypoint.sh后,在其上执行chmod a + x,退出docker bash,然后按以下方式启动它:

docker运行--name = name容器--entrypoint /entrypoint.sh

这允许每个容器都有自己的启动脚本,您可以运行它们而不必担心每次都附加启动脚本


Adr*_*uat 1

Docker 容器将在其主进程结束时退出。在这种情况下,这意味着何时init.sh结束。如果您只想启动一个应用程序,则可以exec在最后启动它,并确保在前台运行它。使用exec将有效地将被调用的服务/应用程序转变为主进程。

如果您要启动多个服务,则最好使用流程管理器,例如supervisordrunit。您需要在前台启动进程管理器守护进程。Docker 文档包含使用supervisord 的示例