如何在我终止 Docker 容器时执行脚本?
简介
在容器终止时执行脚本是指在停止或移除 Docker 容器时运行脚本或命令的过程。这在各种场景中都非常有用,例如清理资源、记录信息或触发其他操作。
容器终止是指停止或移除 Docker 容器的过程。这可以使用 docker stop 或 docker rm 命令手动完成,也可以通过使用容器编排工具或容器生命周期管理功能自动完成。
示例 1:ONBUILD
要使用 **ONBUILD** Dockerfile 命令在容器终止时执行脚本,请按照以下步骤操作:
为将用作容器基础的镜像创建一个 Dockerfile。在 Dockerfile 中,使用 **ONBUILD** 命令指定要在容器终止时运行的脚本或命令。
FROM alpine:3.11 ONBUILD RUN echo "Container terminated" >> /tmp/terminated.log
使用 **docker build** 命令构建镜像。将 **<image_name>** 替换为所需的镜像名称。
$ docker build -t <image_name> .
为基于包含 **ONBUILD** 命令的镜像的容器创建一个 Dockerfile。在 Dockerfile 中,使用 **FROM** 命令指定包含 **ONBUILD** 命令的镜像作为基础镜像。
FROM <image_name>
使用 **docker build** 命令构建容器。将 <container_name> 替换为所需的容器名称。
$ 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> .
为基于包含 **HEALTHCHECK** 命令的镜像的容器创建一个 Dockerfile。在 Dockerfile 中,使用 **FROM** 命令指定包含 **HEALTHCHECK** 命令的镜像作为基础镜像。
FROM <image_name>
使用 **docker build** 命令构建容器。将 <container_name> 替换为所需的容器名称。
$ docker build -t <container_name> .
使用 **docker run** 命令运行容器。将 <container_name> 替换为您在上一步中构建的容器的名称。
$ docker run <container_name>
当您停止或移除容器时,将定期执行 **HEALTHCHECK** 命令中指定的脚本或命令。如果脚本或命令以非零状态码退出,则容器将被视为不健康,并将被停止或移除。在此示例中,脚本将检查 **/tmp/terminated** 文件是否存在,如果存在则以非零状态码退出。
示例 3:--init 标志
要使用 **--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** 命令构建镜像。将 <image_name> 替换为所需的镜像名称。
$ docker build -t <image_name> .
使用 **docker run** 命令运行容器,并使用 --init 标志在容器中运行 init 系统。将 <image_name> 替换为您在上一步中构建的镜像的名称,并将 <container_name> 替换为所需的容器名称。
$ docker run --init --name <container_name> <image_name>
当您停止或移除容器时,将运行 **--init** 标志中指定的 init 系统。init 系统将处理诸如 **SIGTERM** 和 **SIGINT** 等信号,以检测容器何时被停止或移除,并将执行相应的操作。在此示例中,init 系统将消息“收到终止信号”写入控制台,然后以状态码 0 退出。
结论
在本文中,我们了解了如何在容器终止时执行脚本。我们了解到,有多种方法可以在容器终止时执行脚本,例如 **ONBUILD** 和 **HEALTHCHECK** Dockerfile 命令以及 **--init** 标志。我们还看到了如何使用每种选项的示例,并讨论了选择正确选项以及优化脚本执行的性能和可靠性的最佳实践。