【发布时间】:2021-12-11 12:50:34
【问题描述】:
我有作为 docker 入口点运行的 bash 脚本。
这个脚本做了一些事情然后休眠。
当docker stop 命令发出时,我需要能够优雅地停止这个脚本。 AFAIK docker 向进程 1 发送 SIGTERM 信号。
所以我创建了响应 SIGTERM 的 bash 脚本。
没有 docker 也能正常工作,我可以启动它,发出 kill -TERM <pid> 并优雅地停止脚本。不幸的是,它在 docker 中不起作用。
Dockerfile:
FROM ubuntu:20.04
WORKDIR /root
COPY test.sh .
CMD ./test.sh
test.sh:
#!/bin/sh
trap 'echo TERM; exit' TERM
sleep 1 &
while wait $!
do
sleep 1 &
done
我应该如何修改脚本或 Dockerfile 以允许 docker stop 正常工作?
请注意,我不能将 -it 参数传递给 docker run。
【问题讨论】:
-
不是 Bash 脚本,它由
/bin/sh执行,这是一个 POSIX shell,而不是 Bash。 -
容器实际上应该做什么?你可以删除睡眠循环,让容器在其主进程完成时退出吗? (考虑使用
docker run --rm选项启动容器,这样它就会自行删除。)