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.
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
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:
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: