docker - sem crontab para root

Meu Dockerfile parece construir corretamente(isso me diz isso). Quando executo o contêiner, recebo a mensagem de erro abaixo. Eu tentei executar os comandos (CMD) com e sem o diretório do serviço.

crontab.sh basicamente grava uma programação cron em um arquivo de texto (cron.jobs) e, em seguida, importa o arquivo de texto para crontab.

Dockerfile:

FROM node:0.10MAINTAINER TomVOLUME /var/log/RUN mkdir /pulseADD . /pulseWORKDIR /pulseRUN apt-get update && apt-get install -y cronADD *.sh /pulse/RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/RUN chmod 644 /etc/crontabCMD cron -fCMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.logCMD cron /pulse/cron.jobsCMD crontab -l

edited to add crontab.sh

crontab.sh (alguns crons foram removidos):

#!/bin/bashcat <<- 'EOF' > cron.jobs0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1EOFcrontab cron.jobs

Erro:

no crontab for root

Nota:

  • Pulso é o nome do serviço.
  • A versão do nó é antiga devido ao Serviço, isso será atualizado.
  • O serviço é essencialmente para trabalhos cron no nó

É um problema com o dockerfile (em vez dos comandos no arquivo).Unico CMD é executado (o último) - veja https://docs.docker.com/engine/reference/builder/#cmd

Só pode haver uma instrução CMD em um Dockerfile. Se você listar mais de um CMD, apenas o último CMD entrará em vigor.

Como as outras respostas já explicaram, apenas uma CMD será executado por Dockerfile e o comando que você deseja executar está errado.

Mas há um problema mais urgente com sua configuração os contêineres IMO - Docker geralmente não são projetados para funcionar dessa maneira. O que você deve fazer é executar os Serviços cron do host (ou do seu orquestrador) como processos únicos (provavelmente usando algo como docker run ou docker-compose run, ou, se por algum motivo você não quiser iniciar um contêiner separado para isso, acho que você poderia usar docker exec).

Esta é apenas a minha opinião sobre como os recipientes devem ser usados, então obviamente você deve tomá-lo com um grão de sal.

Se você adicionar isso a /etc/crontab, isso não apareceria no crontab pessoal do root, pois contém apenas o crontab específico do Usuário editado com crontab -e, não o de todo o sistema em /etc.


Mais detalhes:

Meu palpite é que /pulse/crontab.sh (o que você não mostra, por quê?) adiciona a linha crontab relevante ao arquivo crontab amplo do sistema /etc/crontab. Mais tarde, você executa o comando crontab -l, mas isso mostra apenas um erro porque lista roots pessoal crontab apenas (que por acaso está vazio), não o de todo o sistema em /etc/crontab. Tudo isso é perfeitamente normal e esperado. Para mostrar a linha que seu script adicionou, você substituiria CMD crontab -l com CMD cat /etc/crontab.

Tudo isso não tem nada a ver com nenhum comando dockerfile como ADD, RUN ou CMD, é apenas coisas básicas do Linux.

Uma combinação de cron - docker - no crontab for root - Server Fault e cron - docker - no crontab for root - Server Fault ajudou a resolver isso.