Obtendo o cron para trabalhar no docker

2

Estou usando nginx no docker. Eu configurei cron jobs para atualizar certificados SSL e registro de DNS. No entanto, as tarefas cron não estão sendo executadas.

O que eu fiz? Eu criei um Dockerfile com base em arm32v7/nginx este 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á nenhum subsistema init instalado, debian: stretch-slim é 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.*)//p') service cron status
[ ok ] cron is running.

No entanto, não vejo nenhum log da tarefa que adicionei ao cron .

Se eu executar run-parts --report /etc/cron.daily , minhas tarefas serão executadas e produzirá 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.*)//p') cat /proc/12/cmdline; echo
/usr/sbin/cron

Então, por que cron não está executando seus trabalhos? O que 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
    
por ctrl-alt-delor 02.07.2018 / 13:21

1 resposta

2

Eu instalei o rsyslog para ver quais erros eu estava recebendo Eu consegui o seguinte

(*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab) . Um pouco de pesquisa me disse que cron tem uma política de segurança para não funcionar se houver muitos hard-links para seus arquivos. Infelizmente, o sistema de arquivos em camadas do Docker faz com que os arquivos tenham muitos hard-links.

Para corrigir isso, adicionei touch /etc/crontab /etc/cron.*/* ao script de inicialização antes de executar cron . Isso desativa se das outras instâncias de arquivo.

O novo ponto de entrada é

#!/bin/sh

#fix link-count, as cron is being a pain, and docker is making hardlink count >0 (very high)
touch /etc/crontab /etc/cron.*/*

service cron start

# Hand off to the CMD
exec "$@"

Eu testei e funciona

Resumo

Para fazer com que cron funcione, você terá que fazer isso.

  • Instale cron - se não estiver instalado
  • Adicione a tarefa cron a /etc/cron.daily/ (ou semanalmente). Certifique-se de que o nome do seu script tenha apenas letras, números, hifens, sem pontos . (Não pergunte) veja trabalho cron não executado a partir do cron.daily
  • Obtenha a contagem de hardlinks de cron s arquivos de configuração para um: do touch /etc/crontab /etc/cron.*/* - (se no docker). Eu coloquei no script de inicialização.
  • Iniciar cron : service cron start - (Se estiver 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 do ponto de entrada desta resposta e tudo o mais da pergunta fará isso. O projeto atual pode ser obtido com hg clone ssh://[email protected]/davids_dad/a_website

    
por 02.07.2018 / 17:25

Tags