Meu Dockerfile parece criar corretamente (é o que me diz). 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 depois importa o arquivo de texto para o crontab.
Dockerfile:
FROM node:0.10
MAINTAINER Tom
VOLUME /var/log/
RUN mkdir /pulse
ADD . /pulse
WORKDIR /pulse
RUN apt-get update && apt-get install -y cron
ADD *.sh /pulse/
RUN chmod 750 /pulse/crontab.sh && chmod 750 /pulse/
RUN chmod 644 /etc/crontab
CMD cron -f
CMD touch /var/log/cron.log && sh /pulse/crontab.sh && tail -f /var/log/cron.log
CMD cron /pulse/cron.jobs
CMD crontab -l
edited to add crontab.sh
crontab.sh (alguns crons foram removidos):
#!/bin/bash
cat <<- 'EOF' > cron.jobs
0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1
EOF
crontab cron.jobs
Erro:
no crontab for root
Notas laterais:
- Pulso é o nome do serviço.
- A versão do nó é antiga devido ao serviço, isso será atualizado.
- O serviço é essencialmente para tarefas cron no nó
Respostas:
É um problema com o dockerfile (em vez dos comandos no arquivo). Apenas um
CMD
é executado (o último) - consulte https://docs.docker.com/engine/reference/builder/#cmdfonte
CMD
porRUN
.Como as outras respostas já explicaram, apenas uma
CMD
será executada por Dockerfile e o comando que você deseja executar está errado.Mas há um problema mais urgente na configuração dos contêineres do IMO-Docker geralmente não são projetados para funcionar dessa maneira. Em vez disso, o que você deve fazer é executar os serviços cron do host (ou seu orquestrador) como processos únicos (provavelmente usando algo como
docker run
ordocker-compose run
, ou, se por algum motivo você não quiser iniciar um contêiner separado para isso, eu acho que você poderia usardocker exec
).Esta é apenas a minha opinião sobre como os recipientes devem ser usados, portanto, obviamente, você deve tomá-lo com um grão de sal.
fonte
docker run
s pontuais . Mais contêiner-y. :)Se você adicionar isso a
/etc/crontab
, isso não aparecerá no crontab pessoal do root, pois contém apenas o crontab específico do usuário editadocrontab -e
, e não o do sistema/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
. Você depois executar o comandocrontab -l
, mas isso só mostra um erro porque ele listasroot
s pessoal crontab somente (que passa a ser vazia), não a todo o sistema em/etc/crontab
. Tudo isso é perfeitamente normal e esperado. Para mostrar a linha que seu script adicionou, você deve substituirCMD crontab -l
porCMD cat /etc/crontab
.Tudo isso não tem nada a ver com comandos dockerfile como
ADD
,RUN
ouCMD
, são apenas coisas básicas do Linux.fonte
ADD . /etc/crontab
como isso não funciona.