docker cron não está funcionando

Estou tentando construir uma imagem docker que teria um cron. Um cron que excluirá arquivos de um local específico do sistema de arquivos docker. Abaixo está o meu Dockerfile

FROM ubuntu:latestMAINTAINER docker@ekito.frRUN apt-get update && apt-get -y install cron# Copy testfiles folder to docker container.COPY ./testfiles /opt/# Create the log file to be able to run tailRUN touch /var/log/cron.logRUN (crontab -l -u root; echo "* * * * * root rm -rf /opt/*") | crontab# Run the command on container startupCMD cronENTRYPOINT ["/bin/sh", "-c", "/bin/bash"]

Tudo é bem sucedido. meu cron também está definido no contêiner

roadrunner:test shailesh$ docker run -it crontest /bin/bashroot@ac31f5acc49f:/# lsbin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  varroot@ac31f5acc49f:/# crontab -l* * * * * root rm -rf /opt/*root@ac31f5acc49f:/# cd /opt/root@ac31f5acc49f:/opt# ls  file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19  file2  file20  file21  file22  file23  file24  file25  file3  file4  file5  file6  file7  file8  file9

No entanto, não está em execução e excluindo os arquivos que estão em /opt/ pasta. Alguém pode me dizer o que está errado na configuração.

Tente algo assim,

FROM ubuntu:latestMAINTAINER docker@ekito.frRUN apt-get update && apt-get -y install cron# Add crontab file in the cron directoryADD crontab /etc/cron.d/hello-cron# Give execution rights on the cron jobRUN chmod 0644 /etc/cron.d/hello-cron# Apply cron jobRUN crontab /etc/cron.d/hello-cron# Create the log file to be able to run tailRUN touch /var/log/cron.log# Run the command on container startupCMD cron && tail -f /var/log/cron.log

criar arquivo crontab e adicionar uma entrada como esta

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

Espero que isso ajude você!!!

Sua sintaxe crontab está errada.

Existem dois lugares onde você pode colocar arquivos cron:

  • no próprio arquivo crontab do usuário, geralmente sob /var/spool/cron/USERNAME. É aqui que as coisas são colocadas automaticamente se você usar o comando crontab.
  • em /etc/cron.d

Se você colocá-lo em /etc/cron.d, o arquivo deve conter o nome do usuário em que você está executando, pois, de outra forma, não há conexão entre o arquivo e o usuário. Mas se você usar o crontab comando, a especificação cron será colocada no crontab pertencente ao seu usuário (ou ao usuário que você especificar ao invocar crontab), então você não precisa incluir o nome de usuário.

Então, para corrigir isso, você pode fazer uma das duas coisas:

  • Você pode remover o nome de usuário da string que está passando para o comando crontab, para que fique assim:

    Execute (crontab-l-u root; echo " * * * * * rm-rf / opt/*|) / crontab
  • Você pode colocar a entrada crontab em um arquivo em /etc/cron.d em vez disso, assim:

    >Execute (echo "* * * * * root rm-rf / opt/* " / etc / cron.d / clearopt)

Eu tenho o mesmo problema no mesmo contexto. Minha dica é criar um script bash para fazer o que quiser na inicialização do contêiner.
e, em seguida, defina o CMD no Dockerfile para executá-lo usando a sintaxe da matriz JSON.

Eu tenho um arquivo start.sh para fazer algumas coisas e eu uso & para executá-lo em segundo plano e, em seguida, eu executo cron && apache2-foregroung para iniciar o cron e o servidor apache.

Este é o comando final no final do meu Dockerfile:

CMD ./start.sh > web/startup.log & cron && apache2-foreground

Learn about when to use ENTRYPOINT vs CMD.