web-dev-qa-db-fra.com

The sortie of `tail -f` au fin d'un docker CMD n'est pas affichée

Utilisation de Docker pour Mac 1.13.1 avec le fichier Docker suivant: 

FROM ubuntu:latest
MAINTAINER [email protected]

#Install packages and clean downloaded packages in the lowest layer
RUN apt-get update && apt-get -y install cron && rm -rf /var/lib/apt/lists/*

# Add crontab file in the cron directory
ADD crontab /etc/cron.d/hello-cron

# Give execution rights on the cron job and create the log file to tail in the next layer
RUN chmod 0644 /etc/cron.d/hello-cron && touch /var/log/cron.log

# Run the command on container startup
CMD echo "starting" && echo "continuing" && (cron) && echo "tailing..."  && tail -f /var/log/cron.log

Avec un fichier de contab de: 

* * * * * root echo "Hello world `date`" >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required to run the cron job

Quand je le construis et le lance avec: 

docker build -t docker-cron-master .
docker run docker-cron-master

Je vois la sortie: 

docker run docker-cron-master
starting
continuing
tailing...

Si j'attends une minute, la sortie de tail -f n'apparaît pas. Pourtant, si je me connecte au conteneur en cours d’exécution et que je termine le fichier, je peux voir le contenu: 

$ docker exec -it 4eda6b1fc6ce bash
root@4eda6b1fc6ce:/# tail -f /var/log/cron.log
Hello world Fri May  5 09:53:01 UTC 2017
Hello world Fri May  5 09:54:01 UTC 2017

J'ai essayé d'ajouter un autre écho à la fin du CMD pour voir si ce n'était que la dernière commande à laquelle STDOUT était avalé, mais cela n'a pas aidé. 

J'ai posté le code est sur github à https://github.com/simbo1905/docker-cron

Merci!

11
simbo1905

Le système de fichiers docker utilise la copie sur écriture avec ses couches superposées. Ainsi, lorsque vous écrivez dans un fichier faisant partie de l'image, il en fait d'abord une copie dans le système de fichiers conteneur, qui est un calque situé au-dessus de tous les calques d'image.

Cela signifie que lorsque vous ajoutez une ligne au fichier /var/log/cron.log, un nouvel inode apparaît dans le système de fichiers et le fichier suivi par la commande tail n'est plus celui que vous voyez lorsque vous avez docker exec dans. le conteneur. Vous pouvez résoudre ce problème en modifiant légèrement l'ajout de "rien" au fichier, ce qui modifie également l'horodatage de la dernière mise à jour, ce qui impose une copie sur écriture:

CMD echo "starting" && echo "continuing" && (cron) \
 && echo "tailing..." && : >> /var/log/cron.log && tail -f /var/log/cron.log

J'ai rassemblé un résumé qui résume ce problème avec beaucoup plus de détails ici: https://Gist.github.com/Sudo-bmitch/f91a943174d6aff5a57904485670a9eb

12
BMitch

Essayez d’utiliser un volume: VOLUME /var/log/

0
Nacho Althabe