我试图了解为什么我的Docker容器不能正常停止并且只是超时。容器正在运行crond
:
FROM alpine:latest
ADD crontab /etc/crontabs/root
RUN chmod 0644 /etc/crontabs/root
CMD ["crond", "-f"]
crontab
文件是:
* * * * * echo 'Working'
# this empty line required by cron
内置docker build . -t periodic:latest
并运行docker run --rm --name periodic periodic:latest
这一切都很好,但是当我尝试从另一个终端进行docker stop periodic
时,它无法正常停止,超时开始并被突然杀死。就像crond
没有响应SIGTERM。
crond
绝对是PID 1
/ # ps
PID USER TIME COMMAND
1 root 0:00 crond -f
6 root 0:00 ash
11 root 0:00 ps
但是,如果我这样做:
docker run -it --rm --name shell alpine:latest ash
和
docker exec -it shell crond -f
在另一个终端中,我可以使用SIGTERM从第一个shell中杀死crond
,所以我知道可以使用SIGTERM停止它。
感谢您的帮助。
答案 0 :(得分:0)
关键是您无法在docker中停止pid = 1进程。它假定docker停止(或者如果它是用--rm
启动的,则终止)。
这就是为什么如果您运行-it ... ash
,shell的值为pid 1,并且您可以杀死其他进程。
如果您想在不停止/杀死docker的情况下杀死cron,只需启动另一个进程作为入口点即可:
在docker入口点之后启动cron(例如,以cmd tail -F /dev/null
运行,然后启动cron docker run -d yourdocker service cron start
)
答案 1 :(得分:0)
向容器(init: true
中的docker-compose.yml
)添加初始化进程即可解决问题。