TL;DR:我应该如何编写一个Dockerfile或docker命令来运行码头容器,这样当我点击ctrl+c时,就可以停止并退出正在运行的码头容器了。
背景
我需要在shell脚本中运行一个无限时间循环。当我在本地运行这个脚本时,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因此,基于shell脚本,我创建了一个包含以下Dockerfile内容的Docker:
FROM debian:stretch
COPY sync.sh .
ENTRYPOINT ["/sync.sh"]并通过运行docker build -t infinite-loop .构建映像
问题
但是,在尝试了运行infinite-loop映像的不同尝试之后,我无法在点击ctrl + c之后停止并退出正在运行的对接器容器。下面是我用来运行docker映像的docker命令:
docker run --rm to-infinity-1 infinite-loopdocker run --rm -it to-infinity-2 infinite-loopdocker run --rm -d to-infinity-3 infinite-loop,然后在to-infinity-3上运行docker attach在直接执行ctrl+c之后,上述所有命令都无法停止和退出无限循环。因此,我需要运行docker stop [container-name]来停止无限循环的运行容器。为了解决这个问题,我应该在我的实现中改变什么?
谢谢。
编辑:附加上下文,我使用的是无限循环容器的kubernetes。我不知道这个ctrl+c问题(与SIGINT有关)是否会干扰kubernetes,如果我想优雅地停下来并退出运行舱。注意,尽管ctrl+c有问题,但我仍然能够使用docker stop来停止正在运行的容器。
发布于 2019-03-01 14:12:29
“停靠者运行”陷阱或忽略ctrl+c.
如果您不想丢失您的外壳,您可以尝试从同一个码头主机上的另一个终端阻止容器。
打开一个新的shell并执行
$ docker ps # get the id of the running container
$ docker stop <container> # kill it (gracefully)容器进程将结束,您的原始shell将被释放。
发布于 2019-03-01 15:34:06
我认为您需要使用陷阱,下面是我的代码示例:
done=0
trap 'done=1' TERM INT
while [ $done = 0 ]; do
#doingstuff
sleep $someinterval &
wait
donectrl +c是一个信号,所以您需要一个信号处理程序。此外,睡眠将需要在后台运行,这样你的陷阱才会在睡眠结束之前被抓住。
https://stackoverflow.com/questions/54946227
复制相似问题