“码头工人停车”终止时间

时间:2020-08-17 08:41:53

标签: docker cron

我试图了解为什么我的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 ashdocker exec -it shell crond -f在另一个终端中,我可以使用SIGTERM从第一个shell中杀死crond,所以我知道可以使用SIGTERM停止它。

感谢您的帮助。

2 个答案:

答案 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)添加初始化进程即可解决问题。