Docker 如何在终止一个容器时执行一个脚本
简介
在容器终止时执行脚本是指在Docker容器被停止或删除时运行脚本或命令的过程。这在各种情况下都很有用,比如清理资源、记录信息或触发其他动作。
容器终止是指停止或删除Docker容器的过程。这可以使用docker stop或docker rm命令手动完成,或者通过使用容器协调工具或容器生命周期管理功能自动完成。
例子1:ONBUILD
要使用 ONBUILD Dockerfile命令在容器终止时执行一个脚本,请遵循以下步骤– 1.
- 为将被用作容器基础的镜像创建一个Dockerfile。在Dockerfile中,使用 ONBUILD 命令来指定你想在容器终止时运行的脚本或命令。
FROM alpine:3.11
ONBUILD RUN echo "Container terminated" >> /tmp/terminated.log
- 使用 docker build 命令建立镜像。将 **< image_name> **替换为所需的镜像名称。
$ docker build -t <image_name> .
- 为容器创建一个Dockerfile,它将以包含 ONBUILD 命令的镜像为基础。在Dockerfile中,使用 FROM 命令来指定包含 ONBUILD 命令的镜像作为基础镜像。
FROM <image_name>
- 使用 docker build 命令构建容器。将
替换为所需容器的名称。
$ docker build -t <container_name> .
- 使用 docker run 命令运行该容器。将 **< container_name> **替换为你在上一步建立的容器的名称。
$ docker run <container_name>
当你停止或删除容器时, ONBUILD 命令中指定的脚本或命令将被执行。在这个例子中,脚本将把消息 “容器已终止 “写到文件 /tmp/terminated.log中。
例2:HEALTHCHECK
要使用 HEALTHCHECK Dockerfile命令在容器终止时执行一个脚本,请遵循以下步骤
- 为将被用作容器基础的镜像创建一个Dockerfile。在Dockerfile中,使用 HEALTHCHECK 命令来指定一个将被定期执行的脚本或命令以检查容器的健康状况。该脚本或命令应该被设计成能够检测到容器何时停止或被删除,并在这种情况下以非零状态代码退出。
FROM alpine:3.11
HEALTHCHECK --interval=5s --timeout=3s \
CMD [ -f /tmp/terminated ] || exit 1
- 使用 docker build 命令建立镜像。将 **< image_name> **替换为所需的镜像名称。
$ docker build -t <image_name> .
- 为容器创建一个Dockerfile,它将以包含 HEALTHCHECK 命令的镜像为基础。在Dockerfile中,使用 FROM 命令指定包含 HEALTHCHECK 命令的镜像作为基础镜像。
FROM <image_name>
- 使用 docker build 命令构建容器。将
替换为所需的容器名称。
$ docker build -t <container_name> .
- 使用 docker run 命令运行该容器。将
替换为你在上一步建立的容器的名称。
$ docker run <container_name>
当你停止或删除容器时, HEALTHCHECK 命令中指定的脚本或命令将被定期执行。如果该脚本或命令以非零状态码退出,则该容器将被认为是不健康的,并将被停止或删除。在这个例子中,脚本将检查文件 /tmp/terminated 是否存在,如果该文件存在,将以非零状态码退出。
例 3: –init 标志
要使用 --init 标志在容器终止时执行一个脚本,请遵循以下步骤
- 创建一个你想在容器终止时运行的脚本或命令。该脚本或命令应该被设计成作为一个初始系统运行,并且应该处理诸如 SIGTERM 和 SIGINT 等信号,以检测容器何时被停止或删除。
#!/bin/bash
echo "Starting init system"
trap "echo 'Received signal to terminate'; exit 0" SIGTERM SIGINT
while true; do
sleep 1
done
- 将脚本或命令保存到一个文件中,并使用 chmod 命令使其可以执行。
$ chmod +x myscript.sh
- 为将被用作容器基础的镜像创建一个Dockerfile。在Dockerfile中,使用 COPY 命令将脚本或命令文件复制到容器中。
FROM alpine:3.11
COPY myscript.sh /usr/local/bin/myscript
- 使用 docker build 命令建立镜像。将
替换为所需的镜像名称。
$ docker build -t <image_name> .
- 使用 docker run 命令运行容器,使用-init标志在容器中运行初始系统。将
替换为你在上一步建立的镜像的名称,将 替换为所需的容器名称。
$ docker run --init --name <container_name> <image_name>
当你停止或删除容器时, -init 标志中指定的 init 系统将被运行。init系统将处理诸如 SIGTERM 和 SIGINT 等信号,以检测容器何时被停止或删除,并将执行适当的动作。在这个例子中,init系统将向控制台写入 “收到终止信号 “的信息,然后以0的状态码退出。
总结
在这篇文章中,我们看了如何在容器终止时执行脚本。我们看到有几个选项可以在容器终止时执行脚本,比如 ONBUILD 和 HEALTHCHECK Dockerfile命令,以及 -init 标志。我们还看到了如何使用这些选项的例子,并讨论了一些选择正确选项和优化脚本执行的性能和可靠性的最佳实践。