docker - não há crontab para raiz

10

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

crontab.sh basicamente escreve um agendamento de cronograma em um arquivo de texto ( cron.jobs ) e, em seguida, importa o arquivo de texto para 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:

  • Pulse é o nome do serviço.
  • A versão do nó é antiga devido ao serviço, isso será atualizado.
  • O serviço é essencialmente para tarefas agendadas no nó
por TomFirth 22.05.2017 / 09:06

3 respostas

11

É um problema com o dockerfile (em vez dos comandos no arquivo). Apenas um CMD é executado (o último) - consulte o link

There can only be one CMD instruction in a Dockerfile. If you list more than one CMD then only the last CMD will take effect.

    
por 22.05.2017 / 10:45
5

Como as outras respostas já foram explicadas, apenas um 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 containers do 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 recipiente separado para isso, eu 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 levá-lo com um grão de sal.

    
por 22.05.2017 / 14:53
3

Se você adicionar isso a /etc/crontab , isso não será exibido no crontab pessoal do root, pois ele 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 (que você não mostra, por quê?) adiciona a linha crontab relevante ao arquivo crontab do sistema /etc/crontab . Posteriormente, você executa o comando crontab -l , mas isso só mostra um erro porque ele lista somente o crontab% em pessoal (que por acaso está vazio), não o em todo o sistema em root . Isso tudo é perfeitamente normal e esperado. Para mostrar a linha que seu script adicionou, você substitui /etc/crontab por CMD crontab -l .

Tudo isso não tem nada a ver com qualquer comando dockerfile, como CMD cat /etc/crontab , ADD ou RUN , é apenas o material básico do Linux.

    
por 22.05.2017 / 09:27

Tags