优雅地停止 Docker 容器

2024-02-03

我无法理解当容器停止时如何进行一些清理。

为了方便起见,我准备了一个示例来重现该问题。

以下是我的文件的内容:

Dockerfile

FROM opensuse:latest

# Install tcsh (non-interactive mode)
RUN zypper -n in tcsh

# Create user
RUN useradd -ms /bin/tcsh dummyuser

# Set the user
USER dummyuser

# Change Working Dir
WORKDIR /home/dummyuser

# Copy entrypoint script
COPY docker-entrypoint.sh $HOME

# Starter Script
ENTRYPOINT ["./docker-entrypoint.sh"]

docker-entrypoint.sh

#!/bin/tcsh

echo "Starting"

onintr cleanup

# Running something in foreground, otherwise the container will stop
while (1)
   sleep 1000
end
exit 0

cleanup:
   onintr -
   echo "cleanup on going"
   exit 0

Make docker-entrypoint.sh可执行文件:

chmod 744 docker-entrypoint.sh

构建图像:

docker build -t my-dummy-img .

请注意,我正在使用tcsh shell.

如果你看一下docker-entrypoint.sh你可以看到我正在等待捕获中断(onintr cleanup)并调用清理方法。

现在,这些是我运行的命令:

mstack/dummy-project> docker run --name my-service -ti -d my-dummy-img ps -eaf
da1dc21281a58e384f2ff34aa49a82019214e204e6d7a77ff54e8c96e005f913
mstack/dummy-project> docker logs my-service
Starting
mstack/dummy-project> docker stop my-service
my-service
mstack/dummy-project> docker logs my-service
Starting
mstack/dummy-project>

这就是问题所在,我希望在第二次之后docker logs my-service输出将是:

Starting
cleanup on going

而不是仅仅

Starting

因为 docker 应该在停止时发送信号......

另一方面,如果我运行:

docker run --name my-service-attached -ti my-dummy-img ps -eaf

And hit CTRL+C,我可以看到预期的输出。

我在这里缺少什么?我希望这个问题足够清楚。

顺便说一句,我在文章中使用了以下内容作为指导:

优雅地停止 Docker 容器 https://www.ctl.io/developers/blog/post/gracefully-stopping-docker-containers/

在 Docker 容器中捕获信号 https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86#.qxvh1vb1e


终于解决了问题。

Tcsh shell 不会接收大多数信号,例如 SIGTERM http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot这是docker停止容器时发送的信号。

因此,我更改了脚本以使用 bash shell,每当我想运行 tcsh 命令时,我都会这样做:

/bin/tcsh ./my-command

So, my docker-entrypoint.sh是这样的:

#!/bin/bash

# SIGTERM-handler this funciton will be executed when the container receives the SIGTERM signal (when stopping)
term_handler(){
   echo "***Stopping"
   /bin/tcsh ./my-cleanup-command
   exit 0
}

# Setup signal handlers
trap 'term_handler' SIGTERM

echo "***Starting"
/bin/tcsh ./my-command

# Running something in foreground, otherwise the container will stop
while true
do
   #sleep 1000 - Doesn't work with sleep. Not sure why.
   tail -f /dev/null & wait ${!}
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优雅地停止 Docker 容器 的相关文章

  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 如何让 Docker 容器在系统启动时自动启动?

    假设我有一个要运行的 Docker 容器 那么我可以调用 docker run 一切都很好 是否有一种内置方法可以在系统崩溃并重新启动时自动重新启动容器来运行容器 如果是这样 这在 Docker Compose 中也可用吗 是的 docke
  • 如何在启用 Hyper-V 的情况下使用 Kitematic?

    我已经安装了适用于 Windows 的 Docker 运行 Windows 10 开箱即用时 Docker 不会在 Hyper V 上安装映像 但我能够让它工作 Edit 我通过此屏幕上的链接获取了 Kitematic 单击下载后 我通过
  • Docker 运行与创建

    有什么区别docker run and docker create命令 我通常使用run但有时在文档中我看到create 码头工人的 help tells create Create a new container run Run a co
  • 集群负载均衡是否应该在其节点上执行运行状况检查?

    The 负载均衡 https docs docker com engine swarm key concepts load balancingswarm 文档中的部分没有明确说明内部负载均衡器是否也进行健康检查 以及是否删除不再运行该服务的
  • 容器内的 Docker Macvlan 网络无法到达其自己的主机

    我在 2 个 docker 主机之间设置了 Macvlan 网络 如下所示 主机设置 HOST 1ens192 172 18 0 21 创建macvlan桥接口 docker network create d macvlan subnet
  • 如何在 Visual Studio 代码中的奇点/docker 图像中使用 python 解释器

    我希望能够在 Visual Studio 代码的奇点图像中使用 python 解释器 似乎将 VSCODE 指向 python 解释器的所有选项都涉及直接路径 但在图像中使用 python 需要一个命令 singularity exec p
  • Docker 容器是否有自己的 TCP/IP 堆栈?

    我试图了解来自连接到主机的线路并定向到 Docker 容器内的应用程序的网络数据包在幕后发生了什么 如果它是一个经典的 VM 我知道到达主机的数据包将由虚拟机管理程序 例如 VMware VBox 等 传输到 VM 的虚拟 NIC 并从那里
  • docker、nginx、django 以及如何提供静态文件

    目标 用于生产 django 网站部署的 docker 容器集 我在这个过程中遇到的问题是 通常 nginx 直接提供静态文件 根据我对使用 docker 的良好架构的理解 您将拥有一个用于 wsgi 服务器的容器 可能是gunicorn
  • 删除后找回 docker-for-windows Kubernetes kubeconfig 文件

    我的 Windows 版 Docker kube config设置对基于云的 K8s 集群的访问时 文件被替换 有没有办法重新创建它而无需重新启动 Docker for Windows Kubernetes Update我现在的 kube
  • udevadm 不显示 docker 容器内的所有属性

    当我运行 docker 容器并列出某些设备的属性时udevadm容器内部只有设备的基本信息 当我在主机上做同样的事情时 我可以看到更多 我该如何获取容器内的所有信息 host udevadm info query property dev
  • 如何在 Visual Studio 上关闭调试后访问在 docker 上运行的网站

    我在 net core 上构建了一个非常简单的 Web 应用程序和 Web api 并配置了 docker compose 以使它们能够通过同一网络正确通信 在 Visual Studio 上 当我在 Docker Compose 项目上运
  • 在 Docker 中更改 Ubuntu 语言环境

    因此 我正在 pt BR 中使用 Ubuntu 和 Postgresql 设置 docker 映像 我想知道如何通过命令行更改默认区域设置而不重新启动系统 这在 Docker 构建中是不可能的 我设法在 Debian 中通过更改 LANG
  • 如何在docker compose中为每个容器创建单独的卷

    我创建了一个docker我想为其运行多个容器的图像 这个 docker 镜像依赖于一些东西 这些东西对于所有容器来说都是相同的 但唯一的区别是容器的配置 version 2 4 services s1 image testdockerimg
  • 为什么 Docker ADD 命令不复制这个文件?

    在下面的文件中 该文件apprequirements txt被添加到容器中 我知道因为pip install作品 但是 那myworker py文件未被复制 添加 Why FROM python 2 7 ENV PYTHONUNBUFFER
  • 连接到远程 Docker 守护进程

    我已经安装了 VirtualBox 并在 VirtualBox VM 中安装了 Ubuntu 服务器版本 我的主机是Windows 10 我还在我的 Windows 主机上安装了 Docker 我的目的是使用 Windows 中的 dock
  • Docker For Windows CE:Kubernetes:无法连接到服务器 eof

    我根本找不到 无法连接到服务器 eof 的解决方案 希望我们能解决这个问题 并在将来搜索解决此问题时对某人有所帮助 我试图在屏幕截图中包含所有信息 如果需要更多信息 请告诉我 我已尝试添加所需的信息 如果您还需要或希望我尝试其他内容 请告诉
  • 是否有一种异步信号安全的方式来读取 Linux 上的目录列表?

    SUSv4 http pubs opengroup org onlinepubs 9699919799 functions V2 chap02 html tag 15 04 03 03未在其异步信号安全函数列表中列出 opendir rea
  • 限制docker容器内的系统调用

    如何限制 docker 容器内进行的任何系统调用 如果给定进程进行系统调用 它将被阻止 或者我如何将 seccomp 与 docker 一起使用 您可以在 Docker 的 Seccomp 安全配置文件 https github com d

随机推荐