Estou usando nginx
no docker. Configurei cron
trabalhos para atualizar certificados SSL e registro de DNS. No entanto, os cron
trabalhos não estão em execução.
O que eu fiz. Eu criei um Dockerfile
baseado arm32v7/nginx
neste estagiário é baseado em debian:stretch-slim
. No começo eu instalei cron
, e assumi que ele seria executado, mas descobri que o serviço não foi iniciado (não há subsistema init instalado, debian:stretch-slim é muito mínimo). Então eu adicionei código para iniciar cron
. Agora, se eu perguntar ao contêiner se cron
está em execução, ele diz que sim.
#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.
No entanto, não estou vendo nenhum log da tarefa que adicionei cron
.
Se eu executar run-parts --report /etc/cron.daily
, minhas tarefas serão executadas e produzirão uma saída de log. Portanto, ainda aparece como se cron
não estivesse em execução.
#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
Então, por que cron
não está executando seus trabalhos? O que eu perdi?
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
Eu instalei
rsyslog
para ver quais erros eu estava recebendo, recebi o seguinte(*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
. Um pouco de pesquisa me disse quecron
tem uma política de segurança para não funcionar se houver muitos links físicos para seus arquivos. Infelizmente, o sistema de arquivos em camadas do Docker faz com que os arquivos tenham muitos links físicos.Para corrigi-lo, adicionei
touch /etc/crontab /etc/cron.*/*
, ao script de inicialização, antes de executarcron
. Isso se desconecta se das outras instâncias de arquivo.O novo ponto de entrada é
ja testei e funciona
Resumo
Para chegar
cron
ao trabalho, você terá que.cron
— se não estiver instalado/etc/cron.daily/
(ou semanalmente). Certifique-se de que seu nome de script tenha apenas letras, números, hífens, sem pontos . (Não pergunte) veja o cron job não sendo executado no cron.dailycron
arquivos de configuração s para um: dotouch /etc/crontab /etc/cron.*/*
— (se estiver no docker). Coloquei no script de inicialização.cron
:service cron start
— (Se em um sistema operacional básico, sem init. Como em muitas imagens de base para uso no docker). Eu coloquei no script de inicialização.O script de ponto de entrada desta resposta e tudo o mais da pergunta farão isso. O projeto atual pode ser obtido com
hg clone ssh://[email protected]/davids_dad/a_website