有一个带有Postgres服务器的docker容器。 Ones postgres被停止或崩溃(没关系)我需要检查一些环境变量和几个文件的状态。
默认情况下,容器在应用程序完成后停止。 我知道有一个选项可以更改dockerfile中的默认行为,但我不再找到它(( 如果有人知道,请给我一个像这样的Dockerfile示例:
FROM something
RUN something ...
ENTRYPOINT [something]
答案 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 需要一个进程来保持在前台运行。否则,它假定应用程序已停止并且容器已关闭。下面,我概述了一些我知道的可以防止容器停止的方法:
使用runit或systemd等进程管理器在容器内运行进程:
例如,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