【问题标题】:Use gcloud metadata-from-file shutdown-script to stop docker container gracefully使用 gcloud metadata-from-file shutdown-script 优雅地停止 docker 容器
【发布时间】:2018-07-15 13:48:24
【问题描述】:

我已经从 docker 镜像创建了 gcloud 计算实例,并将其配置为启动 shutdown script,它应该调用 docker stop 以便优雅地关闭容器中的应用程序。

gcloud beta compute instances create-with-container mycontainername \
    --container-image ypapax/trap_exit \
    --metadata-from-file shutdown-script=./on_shutdown.sh

这是我最初的 on_shutdown.sh:

#!/usr/bin/env bash
docker stop $(docker ps -a -q)

虽然,我添加了更多的调试行,现在on_shutdown.sh 看起来像:

#!/usr/bin/env bash
# https://cloud.google.com/compute/docs/shutdownscript
curl -X POST -d "$(date) running containers on $(hostname): $(docker ps)" http://trap_exit.requestcatcher.com/test
docker stop $(docker ps -a -q)
result=$?
curl -X POST -d "$(date) $(hostname) stop status code: $result" http://trap_exit.requestcatcher.com/test

当我重启谷歌计算实例时:

sudo reboot

脚本on_shutdown.sh 已启动(我看到它正在检查requrest listener)。但是当它试图停止 docker 容器时,还没有什么可以停止的,docker ps 显示空行。

所以这一行:

curl -X POST -d "$(date) running containers on $(hostname): $(docker ps)" http://trap_exit.requestcatcher.com/test

给我

Thu Jul 12 04:29:48 UTC 2018 running containers on myinstance: 

在调用sudo reboot 之前,我检查了docker ps 并看到我的容器正在运行:

$ docker ps     
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
bbaba30e65ff        ypapax/trap_exit    "/entrypoint.sh"    7 seconds ago       Up 7 seconds                            myinstance

所以看起来 docker 容器在调用 reboot 和启动 on_shutdown.sh 之间被杀死。问题是杀戮不会在我的entrypoint 中调用trap cleanup EXIT。需要停止它才能调用清理。 这是我的切入点:

#!/usr/bin/env bash
set -ex

cleanup(){
    echo cleanup is called
    curl -X POST -d "cleanup is called on $(hostname) $(date)" http://trap_exit.requestcatcher.com/test
}

trap cleanup EXIT
curl -X POST -d "container is started on $(hostname) $(date)" http://trap_exit.requestcatcher.com/test
sleep 10000

所以我想在 gcloud 计算实例重启或关闭时运行我的容器清理,但标记 --metadata-from-file shutdown-script=./on_shutdown.sh 无济于事。我还尝试了其他方法来在重启时调用脚本,例如this。但是我的脚本根本没有启动。

这是我的Dockerfile,如果有帮助的话。

【问题讨论】:

    标签: linux docker gcloud


    【解决方案1】:

    首先有limitations coming with this approach

    如您所见,docker 可能在关闭脚本运行时已经停止:检查docker ps -a(而不是 docker ps)以查看所有退出容器的状态。 尝试adding a supervisor(如in this example)本身的docker镜像,以查看主管,或至少use the docker run --init option:目标是检查容器本身是否使用它们的主管脚本。

    【讨论】:

    • thx,supervisord 帮了大忙,我什至不用--metadata-from-file shutdown-script
    • @MaximYefremov 太好了!不要犹豫,发布您自己的答案,详细说明您在案件中最终做了什么。
    • @MaximYefremov 您介意解释一下您为解决问题所做的工作吗?我有同样的问题,不知道主管如何帮助解决这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2018-09-08
    • 2017-09-20
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多