Cron n'est pas en cours d'exécution lorsque je démarre mon conteneur docker
À la préface, j'ai été le référencement de ces deux articles pour vous aider:
- Exécuter une tâche cron avec Docker - Julien Boulay
- L'exécution des tâches cron à l'intérieur d'un conteneur Docker - Chris S.
Mon but est d'avoir une tâche cron démarrer automatiquement lorsque je démarre mon conteneur docker. Actuellement, il ne démarre pas automatiquement, mais je peux aller manuellement dans mon conteneur et exécuter service cron start
, qui démarre le travail, et elle fonctionne correctement.
Le problème est donc de: Comment puis-je obtenir ma tâche cron pour démarrer automatiquement lorsque mon conteneur démarre?
Dockerfile
FROM microsoft/dotnet:latest
RUN apt-get update && apt-get install -y cron
COPY . /app
WORKDIR /app
ADD crontab /etc/cron.d/crontab
RUN chmod 0600 /etc/cron.d/crontab
RUN crontab -u root /etc/cron.d/crontab
RUN touch /var/log/cron.log
RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
EXPOSE 5000/tcp
CMD cron && tail -f /var/log/cron.log
CMD service cron start
crontab
* * * * * echo "Hello world" >> /var/log/cron.log 2>&1
# Empty space
Si je n'étais pas en mesure d'obtenir cron de travail dans ce conteneur particulier, j'ai été capable de créer une application autonome docker conteneur spécialement pour cron, et a réussi à le faire fonctionner automatiquement.
Autant que la configuration du cron conteneur, j'ai suivi l'article lié, Exécuter une tâche cron avec Docker - Julien Boulay, et a été en mesure de le faire fonctionner.
Il doit être en cours d'exécution à l'intérieur du conteneur.
Vous avez déjà vu question ?
Oui, cette question est fondamentalement juste les contours de ma première référence.
Cela peut sembler une question stupide, mais c'est votre conteneur en cours d'exécution? Je vois que vous avez 2
CMD
directives à la fin de votre Dockerfile, je pense que la seconde va remplacer le premier. En supposant qu'il n', service cron start
devrait se terminer avec succès, une fois la commande terminée, le récipient doit être fermé.OriginalL'auteur Tory | 2016-10-21
Vous devez vous connecter pour publier un commentaire.
Ce que je fais est de la CMD appel cron directement comme ceci:
Avant que j'ajoute la crontab pour le conteneur et son assignation que le crontab de root avec la commande:
Vous n'avez pas besoin d'appeler la commande crontab sur les fichiers qui sont situés dans
/etc/cron.d
, mais vous avez besoin de ces fichiers pour avoir la syntaxe correcte. À l'aide de votre exemple, au lieu de cela:Vous devriez avoir ceci:
Sur votre fichier crontab. Cela s'applique uniquement aux fichiers crontab situé dans
/etc/cron.d
, sinon votre fichier crontab syntaxe est correcte et que vous utilisez lecrontab
de commande pour le charger.À partir de votre exemple, je pense que vous devriez modifier vos fichiers comme ceci:
Dockerfile
crontab
Une autre alternative serait:
Dockerfile
crontab
J'ai essayé les deux versions de votre réponse, et ça ne marche toujours pas. Est-t-il d'autres informations que je peux fournir pour mieux les aider?
Je viens de tester à l'aide de la deuxième version (la suppression de la dotnet restauration & renforcer les commandes à partir de la dockerfile) et cron fonctionne. Pouvez-vous obtenir à l'intérieur du conteneur et de voir si cron est en cours d'exécution? (ex:
ps auxw|grep cron
)Donc, ce que je fais;
docker-compose build
,docker-compose up -d
, alors que je suis dans mon conteneur viadocker exec -it {container-id} bash
, puis de vérifier pour voir si cron est en cours d'exécution parservice cron status
, qui renvoiecron is not running ... failed!
J'ai essayé avec les mêmes commandes, mais pour moi
service cron status
retournecron is running.
. Je suis en essais sur une ubuntu boîte avec 4.4.0.45-noyau generic. Êtes-vous tester sur une zone de Windows?OriginalL'auteur Alvaro Carvajal
Il y a un bug dans les distributions basées sur Debian qui va provoquer des cronjobs pas parce que docker utilise des couches du système de fichiers et cron ne démarre pas et dit
NUMBER OF HARD LINKS > 1 (/etc/crontab)
.La solution est simple, ajouter
touch /etc/crontab /etc/cron.*/*
pour le point d'entrée de votre conteneur.J'ai fait un post de blog expliquant comment configurer cron dans un conteneur Docker ici : https://digitz.org/blog/cron-jobs-in-docker/
OriginalL'auteur Root
Nous avons eu un problème avec php-fpm et docker où notre tâche cron tâches n'ont pas été exécutées. Il y avait deux problèmes que nous avons résolus:
crontab
fichier dans le menu fixe d'un conteneur en utilisantCOPY config/custom-cron /etc/cron.d/custom-cron
. Le problème, c'est que notre les fins de ligne étaient en windows format. Ce n'briser notre fichier crontab, parce que cette ligne endigs ne sont pas convertis, tandis que de copier ce fichier dans le conteneur.CMD ["cron", "-f"]
qui fait bloc principalphp-fpm
processus. Il en résulte une502 Bad gateway
d'erreur lors de l'appel de notre application web.Finalement, nous avons fait le travail en modifiant le fichier crontab manuellement lors de la construction de l'image docker au lieu de copier-coller et à l'aide de supervisord d'avoir plusieurs tâches en cours d'exécution à l'intérieur de docker. Cela doit fonctionner sur tous les systèmes d'exploitation supportés.
dockerfile
supervisord.conf
OriginalL'auteur lin