【问题标题】:How do avoid a docker container stop after the application is stopped应用程序停止后如何避免docker容器停止
【发布时间】:2018-09-05 15:01:05
【问题描述】:

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

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

FROM something

RUN something ...

ENTRYPOINT [something]

【问题讨论】:

标签: postgresql docker dockerfile


【解决方案1】:

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

tail -f '一些日志文件'

【讨论】:

  • 或者tail一个肯定存在的文件tail -f /etc/hosts
  • 这对调试很有用,但在一般操作中是个坏主意。需要的进程应该是保持容器运行的进程。
【解决方案2】:

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

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 }}'

【讨论】:

    【解决方案3】:

    一般来说,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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      • 2019-02-13
      • 1970-01-01
      • 2016-02-21
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多