我nginx
在码头工人中使用。我已配置cron
作业以更新 SSL 证书和 DNS 注册。但是cron
作业没有运行。
我做了什么。我创建了一个Dockerfile
基于arm32v7/nginx
这个实习生是基于debian:stretch-slim
. 一开始我安装了cron
,假设它会运行,但后来发现服务没有启动(没有安装init子系统,debian:stretch-slim非常小)。所以我添加了代码开始cron
。现在如果我问容器是否cron
正在运行,它说是。
#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') service cron status
[ ok ] cron is running.
但是,我没有看到我添加到的任务的任何日志cron
。
如果我运行run-parts --report /etc/cron.daily
,我的任务就会运行,并产生日志输出。因此它仍然看起来好像cron
没有运行。
#ctrl-alt-delor@raspberrypi:~/a_website/docker$
#↳ docker exec -it $(docker container ls | sed -nr -e 's/.*(website-stack.*)/\1/p') cat /proc/12/cmdline; echo
/usr/sbin/cron
那么为什么cron
不运行它的工作呢?我错过了什么?
Dockerfile
FROM arm32v7/nginx
##add backports
COPY stretch-backports-source.list /etc/apt/sources.list.d/
##install cron and curl — so we can register dns regularly
RUN apt-get update &&\
apt-get install -y cron curl &&\
apt-get clean
##setup cron to register dns
COPY register-dns register-dns.auth register-dns-hostname /usr/local/bin/
COPY register-dns.cron /etc/cron.daily/1-register-dns
RUN chmod +x /usr/local/bin/register-dns /etc/cron.daily/1-register-dns
##add curtbot
RUN apt-get update && \
apt-get -t stretch-backports install -y python-certbot-nginx && \
apt-get clean
#add ssl port
EXPOSE 443 80
##custom entry point — needed by cron
COPY entrypoint /entrypoint
RUN chmod +x /entrypoint
ENTRYPOINT ["/entrypoint"]
CMD ["nginx", "-g", "daemon off;"] #:tricky: we seem to need to re-specify this
LABEL name="my-nginx" \
description="nginx + cron + curl + certbot + dns-registering"
entrypoint
#!/bin/sh
## Do whatever you need with env vars here ...
service cron start
# Hand off to the CMD
exec "$@"
/etc/crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
/etc/cron.daily/1-register-dns
#!/bin/sh
date >> /var/log/register-dns
/usr/local/bin/register-dns >>/var/log/register-dns
我安装
rsyslog
了看看我得到了什么错误我得到了以下(*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
. 一些搜索告诉我,cron
如果有很多指向其文件的硬链接,则有一个安全策略不起作用。不幸的是,Docker 的分层文件系统使文件有很多硬链接。为了修复它,我
touch /etc/crontab /etc/cron.*/*
在启动脚本中添加了cron
. 如果从其他文件实例中分离,这将解除附加。新的入口点是
我已经测试过并且有效
概括
要
cron
上班,您将不得不这样做。cron
——如果没有安装/etc/cron.daily/
(或每周)。确保您的脚本名称只有字母、数字、连字符,没有点。(不要问)看cron 作业没有从 cron.daily 运行cron
减至 1:dotouch /etc/crontab /etc/cron.*/*
—(如果在 docker 中)。我把它放在启动脚本中。cron
如果service cron start
在基本操作系统上,没有 init。就像在 docker 中使用的许多基本映像一样)。我把它放在启动脚本中。此答案中的入口点脚本以及问题中的所有其他内容都会执行此操作。当前项目可以通过
hg clone ssh://[email protected]/davids_dad/a_website