web-dev-qa-db-fra.com

Comment lire des fichiers et stdout à partir d'un conteneur Docker en cours d'exécution

Comment procéder pour démarrer une application sur mon ordinateur hôte afin de lire les fichiers et la sortie standard d'un conteneur de menu fixe en cours d'exécution? 

Essentiellement, je veux faire ceci:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

Comment pourrais-je m'y prendre? Pour être plus précis avec où j'essaie d'aller avec cela; Je veux lire les journaux et la sortie standard d'un conteneur de menu fixe et les faire traiter ailleurs. 

Je suis également disposé à créer un autre conteneur Docker capable de lire les fichiers et la sortie standard d'un autre conteneur, mais je ne sais pas si cela est possible.

64
rexposadas

Le stdout du processus lancé par le conteneur Docker est disponible via la commande docker logs (utilisez -f pour le conserver indéfiniment). Une autre option serait de diffuser les journaux directement via l’API distante docker .

Pour accéder aux fichiers journaux (uniquement si vous devez, pensez à vous connecter à stdout ou à une autre solution standard telle que syslogd), votre seule option en temps réel consiste à configurer un volume (comme le suggère Marcus Hughes) afin que les journaux soient stockés hors du conteneur et disponible pour le traitement à partir de l'hôte ou d'un autre conteneur.

Si vous n'avez pas besoin d'un accès en temps réel aux journaux, vous pouvez exporter les fichiers (au format tar) avec docker export

97
Abel Muiño

Pour afficher la sortie standard, vous pouvez démarrer le conteneur de menu fixe avec -i. Bien entendu, cela ne vous permet pas de quitter le processus démarré et d’explorer le conteneur.

docker start -i containerid

Vous pouvez également afficher le système de fichiers du conteneur à l’adresse suivante:

/var/lib/docker/containers/containerid/root/

Cependant, ni de ceux-ci sont idéaux. Si vous souhaitez afficher les journaux ou tout stockage persistant, la méthode correcte consiste à associer un volume avec le commutateur -v lorsque vous utilisez docker run. Cela signifie que vous pouvez inspecter les fichiers journaux sur l'hôte ou les attacher à un autre conteneur et les inspecter à cet emplacement.

16
Marcus Hughes

Vous pouvez voir le système de fichiers du conteneur à

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

et vous pouvez juste 

tail -f mylogfile.log
5
maestr0

Le partage de fichiers entre un conteneur de menu fixe et le système hôte, ou entre des conteneurs distincts, est mieux réalisé à l'aide de volumes .

L'exécution de votre application dans un autre conteneur est probablement votre meilleure solution, car elle vous permettra de bien isoler votre application et de la déployer facilement. Ce que vous essayez de faire semble très proche de la configuration décrite dans cet excellent article de blog , jetez un oeil!

3
Jules Olléon

Un peu tard mais c’est ce que je fais avec journald. C'est assez puissant. 

Vous devez exécuter vos conteneurs Docker sur un système d'exploitation avec systemd-journald.

docker run -d --log-driver=journald myapp

Ceci se retrouve dans le journal Host, qui s'occupe de choses telles que l'élagage des bûches, le format de stockage, etc.

journalctl CONTAINER_NAME=myapp -f 

qui alimentera votre console au fur et à mesure de son journalisation,

journalctl CONTAINER_NAME=myapp > output.log 

qui vous donne le tout dans un fichier à emporter, ou 

journalctl CONTAINER_NAME=myapp --since=17:45

De plus, vous pouvez toujours voir les journaux via docker logs .... si tel est votre préférence.

Pas plus > my.log ni -v "/apps/myapp/logs:/logs" etc

1
Adam