我有一个在docker容器内运行的cronjob,它检查所有服务是否按预期运行.如果这个cronjob确定存在问题我想停止docker容器(从内部......)
不幸的是,exit只是停止我的cronjob脚本
基本上,您需要PID 1退出以停止容器.
我最初认为kill -s SIGKILL 1会工作,但PID 1受到保护,所以它没有.
正如@Thomasleveil所建议的那样,您可以将代码添加trap "exit" SIGINT SIGTERM到PID 1脚本中,这意味着进程在发送时将退出kill -s SIGINT 1.我稍微倾向于使用这个方法(直接杀死子进程),因为它为父进程提供了清理的机会,并且父进程应该能够在没有awk的情况下找到子进程的PID.
但是,如果您正在运行多个进程,则应考虑使用supervisord或runit之类的东西.
我遇到了同样的问题,我通过使用docker 的健康检查功能解决了它。
您可以添加检查以在文件中验证您的服务heahthcheck.sh。然后将类似以下内容附加到您的Dockerfile:
# Healthcheck
COPY healthcheck.sh /
RUN chmod +x /healthcheck.sh
HEALTHCHECK --interval=10s --retries=5 CMD /healthcheck.sh
Run Code Online (Sandbox Code Playgroud)
这确保 docker 通过在指定的时间间隔内运行您的脚本来检查您的容器的健康状况,如果它连续 5 次失败,则将状态标记为不健康。
现在,为了在状态不正常时重新启动容器,您可以像这样使用自动修复:
docker run -d \
--name autoheal \
--restart=always \
-e AUTOHEAL_CONTAINER_LABEL=all \
-v /var/run/docker.sock:/var/run/docker.sock \
willfarrell/autoheal
Run Code Online (Sandbox Code Playgroud)
每次容器状态不正常时,这都会重新启动容器。
受到@JakeRobb的启发:您可以使用以下命令执行docker:
/bin/bash -c "while true; do sleep infinity || exit 0; done"
Run Code Online (Sandbox Code Playgroud)
这将在 PID 低于 1 的情况下执行 sleep。一旦杀死它,循环就会退出。为此,在 docker 中使用:
pkill -f sleep
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11002 次 |
| 最近记录: |