如何使用 CTRL+C 退出并终止正在运行的 Docker 容器?

dek*_*iya 7 bash shell docker kubernetes google-kubernetes-engine

TL; DR:我应该如何编写 aDockerfile或 docker 命令来运行 docker 容器,以便在点击 时可以停止并退出正在运行的 docker 容器ctrl+c


背景

我需要在 shell 脚本中运行无限 while 循环。当我在本地运行此脚本时,该ctrl+c命令将退出无限循环。

# content of sync.sh

while true; do
  echo "Do something!"
  some_syncing_command || {
    rm -rf /tmp/healthy && break
  }
  echo "Finish doing something!"
  touch /tmp/healthy
  sleep ${waitingSeconds}
done
Run Code Online (Sandbox Code Playgroud)

因此,基于 shell 脚本,我创建了一个包含以下Dockerfile内容的 Docker 镜像:

FROM debian:stretch 
COPY sync.sh .

ENTRYPOINT ["/sync.sh"]
Run Code Online (Sandbox Code Playgroud)

并通过运行构建图像docker build -t infinite-loop .

问题

但是,在尝试不同的尝试运行infinite-loop图像后,我无法在点击后停止并退出正在运行的 docker 容器ctrl + c。以下是我用来运行 docker 镜像的 docker 命令:

  1. docker run --rm to-infinity-1 infinite-loop
  2. docker run --rm -it to-infinity-2 infinite-loop
  3. docker run --rm -d to-infinity-3 infinite-loop,然后docker attach继续运行to-infinity-3

以上所有命令ctrl+c直接执行后都无法停止并退出无限循环。因此我需要运行docker stop [container-name]来停止无限循环的运行容器。我应该在实施中改变什么来解决这个问题?

谢谢。

编辑:附加上下文,我将 kubernetes 与无限循环容器一起使用。ctrl+c我想知道如果我想优雅地停止并退出正在运行的 pod,这个问题(与 SIGINT 相关)是否会干扰 kubernetes。请注意,尽管ctrl+c存在问题,但我仍然能够用来docker stop停止正在运行的容器。

小智 12

\xe2\x80\x9cdocker run\xe2\x80\x9d 捕获或忽略 ctrl+c。

\n\n

如果您不想丢失 xe2x80x99 的 shell,您可以尝试从同一 docker 主机上的另一个终端停止容器。

\n\n

打开一个新的shell并执行

\n\n
$ docker ps # get the id of the running container\n$ docker stop <container> # kill it (gracefully)\n
Run Code Online (Sandbox Code Playgroud)\n\n

容器进程将结束,您的原始 shell 将被释放。

\n