繁体   English   中英

在 docker 停止容器之前自动调用容器中的脚本

[英]call a script automatically in container before docker stops the container

我想要容器中的自定义 bash 脚本,该脚本在容器停止之前自动调用( docker stopctrl + c )。

根据这个 docker 文档和多个 StackOverflow 线程,我需要在容器中捕获SIGTERM信号,然后在事件出现时运行我的自定义脚本。 据我所知, SIGTERM只能在PID 1的根进程中使用。

我的Dockerfile的相关部分:

...
COPY container-scripts/entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]

我使用[]来定义entrypoint ,据我所知,这将直接运行我的脚本,而无需/bin/sh -c包装器( PID 1 ),并且当脚本最终执行另一个进程时,该进程成为主进程并且将收到 docker 停止信号。

入口点.sh:

...
# run the external bash script if it exists
BOOT_SCRIPT="/boot.sh"
if [ -f "$BOOT_SCRIPT" ]; then
    printf ">> executing the '%s' script\n" "$BOOT_SCRIPT"
    source "$BOOT_SCRIPT"
fi

# start something here
...

boot.sh容器用来执行子容器想要的其他东西。 一切都很好,我的容器工作得很好。

ps axu在子容器中:

PID   USER     TIME  COMMAND
    1 root      0:00 {entrypoint.sh} /bin/bash /entrypoint.sh
  134 root      0:25 /usr/lib/jvm/java-17-openjdk/bin/java -server -D...
  ...
  421 root      0:00 ps axu

在停止容器之前,我需要自动运行一些命令,所以我创建了一个shutdown.sh bash 脚本。 这个脚本工作正常并且可以满足我的需要。 但是我是这样手动执行关机脚本的:

$ docker exec -it my-container /bin/bash
# /shutdown.sh
# exit

$ docker container stop my-container

我想自动执行shutdown.sh脚本。

我试图将以下内容添加到 entrypoint.sh 但它不起作用:

trap "echo 'hello SIGTERM'; source /shutdown.sh; exit" SIGTERM

我的代码有什么问题?

您的帮助和评论引导我朝着正确的方向前进。 我再次浏览了这里这里这里的官方文档,最后我发现了问题所在。

问题如下:

我的entrypoint.sh脚本使容器保持活动状态,最后执行了以下命令:

# start the ssh server
ssh-keygen -A
/usr/sbin/sshd -D -e "$@"

-D选项以 NOT 分离模式运行 ssh 守护程序,并且sshd不会成为守护程序。 实际上,那是我的意图,这就是我让容器保持活力的方式。

但是这个前台进程阻止了trap命令的正确执行。 我改变了启动sshd应用程序的方式,现在它作为正常的后台进程运行。

然后,我添加了以下命令来使我的 docker 容器保持活动状态(这是推荐的最佳做法):

tail -f /dev/null

但当然,同样的问题出现了。 Tail作为前台进程运行, trap命令不执行其工作。

让容器保持活动状态并让entrypoint.sh在 docker 中作为外部进程运行的唯一方法如下:

while true; do
    sleep 1
done

这样trap命令就可以正常工作,我的 bash function 处理SIGINT等信号在时间到了时可以正常运行。

但老实说,我不喜欢这种解决方案。 这个带有sleep的无限循环看起来很难看,但我现在不知道如何以一种好的方式管理它:(

但这是另一个不属于该线程的问题(但如果你能建议我更好的解决方案可能会很棒)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM