我无法理解当容器停止时如何进行一些清理。
为了方便起见,我准备了一个示例来重现该问题。
以下是我的文件的内容:
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