我正在尝试在容器内运行 cron 作业以及女服务员 http 服务器。无论我做什么,似乎都无法让 cron 在容器内自动启动...
这是我的docker文件:
FROM python:3.7.6-buster
RUN apt-get update -y && apt-get install -y python3-dev cron
WORKDIR /home/user
COPY . .
RUN echo "* * * * * root echo hello >> /home/log.log 2>&1\n" > /etc/cron.d/task
RUN chmod 0644 /etc/cron.d/task
RUN crontab /etc/cron.d/task
RUN touch /home/log.log
CMD cron
EXPOSE 80
ENTRYPOINT [ "waitress-serve" ]
CMD [ "-call", "main:main" ]
我也尝试启动 cron 服务,但是当容器启动时,service cron status
显示以下内容:
[FAIL] cron is not running ... failed!
我究竟做错了什么?
答案1
您没有在 dockerfile 的任何地方启动 cron。此外,容器不使用 init.d 和 systemd,它们不是虚拟机,也没有自己的 systemd/init.d。这就是您看到以下错误的原因:
[FAIL] cron is not running ... failed!
我的解决方案是编写简单的 bash 脚本(或者只是更改整个 CMD),启动 crond 和其他您想要在后台运行的东西。示例:
crond -P -n -s && waitress-serve -call main:main && tail -f /home/log.log
命令尾部-f是为了防止立即退出你的容器。标志-P -n -s用于从环境继承路径(-P)、将作业输出发送到 syslog(可选,这只是我的偏好)(-s)并在后台工作(-n)。
然后只需复制该脚本并将 CMD 更改为:
CMD script.sh
还要将其添加到您的dockerfile中。这是强制性的-n旗帜。
RUN sed -i '/session required pam_loginuid.so/c\#session required pam_loginuid.so' /etc/pam.d/crond
我认为现在应该可以了。如果你遇到问题,只需给我留言。这是我的第一个解决方案,所以请耐心等待 :D