docker - sem crontab para o root

10

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.shbasicamente 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ó
TomFirth
fonte
Uma combinação de serverfault.com/a/851500/395574 e serverfault.com/a/851479/395574 ajudou a resolver isso.
TomFirth

Respostas:

11

É 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/#cmd

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

Paul Haldane
fonte
Ah, e existe isso em cima de tudo o mais :) Para OP: Isso não invalida minha explicação e você precisaria essencialmente substituí-lo CMDpor RUN.
Sven
2
Acho que chamar isso de um problema está um pouco fora. Esse comportamento é por design. Os contêineres não são mini-sistemas operacionais. Eles são centrados no aplicativo.
21417 JimmyJames
Acordado. Minha intenção era esclarecer que o problema do OP estava na configuração do docker, em vez de nos detalhes do cron.
Paul Haldane
Este não é um problema do docker . É por design.
Andrew Savinykh
5

Como as outras respostas já explicaram, apenas uma CMDserá 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 runor docker-compose run, ou, se por algum motivo você não quiser iniciar um contêiner separado para isso, eu acho que você poderia usar docker 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.

Artur Ciesielski
fonte
2
Eu tenho apenas uma familiaridade passageira com o cron, mas acho que, para tornar isso sensato, o CMD precisaria rodar sem problemas. Caso contrário, o contêiner sairá após o término do comando crontab.
21417 JimmyJames
@ JimmyJames O que você está dizendo está correto, mas, como expliquei acima, a melhor solução é executar esses comandos de um cron externo como docker runs pontuais . Mais contêiner-y. :)
Artur Ciesielski
Você pode estar certo. A pergunta é interessante porque não está claro se faz sentido executar crond como comando do seu contêiner. Pode ser viável, mas parece estranho em um contêiner.
21417 JimmyJames
3

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 editado crontab -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 comando crontab -l, mas isso só mostra um erro porque ele listas roots 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 substituir CMD crontab -lpor CMD cat /etc/crontab.

Tudo isso não tem nada a ver com comandos dockerfile como ADD, RUNou CMD, são apenas coisas básicas do Linux.

Sven
fonte
Eu acho que entendo isso. Minhas configurações de compilação estão no usuário, mas minhas configurações de execução estão tentando executar a partir do crontab da raiz? isso faz sentido, vou tentar contornar isso. Acho que você não quis dizer: ADD . /etc/crontabcomo isso não funciona.
TomFirth
@ TomFirth: Isso não faz muito sentido. Por favor, leia minha edição para mais detalhes.
Sven