如何在应用程序停止描述后避免停靠器容器停止

时间:2018-03-27 09:16:46

标签: postgresql docker dockerfile

有一个带有Postgres服务器的docker容器。 Ones postgres被停止或崩溃(没关系)我需要检查一些环境变量和几个文件的状态。

默认情况下,容器在应用程序完成后停止。 我知道有一个选项可以更改dockerfile中的默认行为,但我不再找到它(( 如果有人知道,请给我一个像这样的Dockerfile示例:

FROM something

RUN something ...

ENTRYPOINT [something]

3 个答案:

答案 0 :(得分:1)

您可以在入口点的末尾简单地运行非退出流程,以使容器保持活动状态,即使主进程退出也是如此。 例如,使用

  

tail -f'一些日志文件'

答案 1 :(得分:0)

没有"选项"在主进程停止或死亡时保持容器运行。在调试实际的启动脚本时,您可以在容器中运行不同的东西。有时您需要覆盖入口点才能执行此操作。

docker run -ti $IMAGE /bin/sh
docker run -ti --entrypoint=/bin/sh $IMAGE

如果在您docker start现有容器时主要流程无法继续运行,那么您将无法以交互方式使用该容器,否则您可以:

docker start $CID
docker exec -ti $CID sh 

要从现有容器中获取文件,您可以从已停止的容器docker cp中获取所需内容。

docker cp $CID:/a/path /some/local/path

您还可以docker export完整容器的tar存档。

docker export $CID -o $CID.tar
tar -tvf $CID.tar | grep afile

使用docker inspect可以看到Docker注入的环境,但是这不会为您提供进程添加到环境中的任何内容。

docker inspect $CID --format '{{ json .Config.Env }}'

答案 2 :(得分:0)

一般来说,Docker 需要一个进程来保持在前台运行。否则,它假定应用程序已停止并且容器已关闭。下面,我概述了一些我知道的可以防止容器停止的方法:

使用runitsystemd等进程管理器在容器内运行进程

例如,here 您可以找到一篇关于在 docker 容器中运行 systemd 的 Redhat 文章。

几种可能的调试方法:

a) 向入口点添加人工睡眠或暂停:

例如,在 bash 中,您可以使用它来创建无限暂停:

while true; do sleep 1; done

b) 为了快速解决问题,可以在容器中运行 tail 命令:

例如,使用下面的命令,我们以分离/后台模式(-d)启动一个新容器,并在容器内执行 tail -f /dev/null 命令。结果,这将迫使容器永远运行。

docker run -d ubuntu:18.04 tail -f /dev/null

如果主进程崩溃/退出,您仍然可以查找 ENV 变量或使用 exec 和基本命令(如 cd、ls)检查文件。一些相关的命令:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' name-of-container

docker exec -it name-of-container bash