Mon Dockerfile semble se construire correctement (il me le dit). Lorsque j'exécute le conteneur, j'obtiens le message d'erreur ci-dessous. J'ai essayé d'exécuter les commandes ( CMD
) avec et sans le répertoire du service.
crontab.sh
écrit essentiellement une planification cron dans un fichier texte ( cron.jobs
), puis importe le fichier texte dans 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 (certains crons ont été supprimés):
#!/bin/bash
cat <<- 'EOF' > cron.jobs
0 * * * * node /pulse/scripts/awsPulseTest.js > /tmp/awsPulseTest.log 2>&1
EOF
crontab cron.jobs
Erreur:
no crontab for root
Notes annexes:
- Pulse est le nom du service.
- La version du nœud est ancienne en raison du service, elle sera mise à niveau.
- Le service est essentiellement destiné aux tâches cron dans le nœud
Réponses:
C'est un problème avec le dockerfile (plutôt qu'avec les commandes du fichier). Un seul
CMD
est exécuté (le dernier) - voir https://docs.docker.com/engine/reference/builder/#cmdla source
CMD
parRUN
.Comme les autres réponses l'ont déjà expliqué, une seule
CMD
sera exécutée par Dockerfile et la commande que vous souhaitez exécuter est incorrecte.Mais il y a un problème plus urgent avec votre configuration IMO - Les conteneurs Docker ne sont généralement pas conçus pour fonctionner de cette façon. Ce que vous devez faire à la place, c'est exécuter les services cron à partir de l'hôte (ou de votre orchestrateur) en tant que processus ponctuels (en utilisant probablement quelque chose comme
docker run
oudocker-compose run
, ou, si pour une raison quelconque vous ne voulez pas démarrer un conteneur séparé pour cela, je devinez que vous pourriez utiliserdocker exec
).Ce n'est que mon avis sur la façon dont les conteneurs doivent être utilisés, alors vous devez évidemment le prendre avec un grain de sel.
la source
docker run
s uniques. Plus de conteneurs-y. :)Si vous ajoutez ceci à
/etc/crontab
, cela n'apparaîtra pas dans la crontab personnelle de root, car il ne contient que la crontab spécifique à l'utilisateur éditée aveccrontab -e
, pas celle du système dans/etc
.Plus de détails:
Je suppose que
/pulse/crontab.sh
(que vous ne montrez pas, pourquoi?) Ajoute la ligne crontab pertinente au fichier crontab à l'échelle du système/etc/crontab
. Vous exécutez la commande plus tardcrontab -l
, mais cela montre seulement une erreur car il listeroot
de personnel crontab seulement (qui se trouve être vide), pas celui de l' ensemble du système dans/etc/crontab
. Tout cela est parfaitement normal et attendu. Pour afficher la ligne ajoutée par votre script, vous devez remplacerCMD crontab -l
parCMD cat /etc/crontab
.Tout cela n'a rien à voir avec les commandes dockerfile comme
ADD
,RUN
ouCMD
, c'est juste des trucs Linux basiques.la source
ADD . /etc/crontab
car cela ne fonctionne pas.