Maison >développement back-end >Tutoriel Python >Pourquoi mon conteneur Python Docker détaché n'affiche-t-il pas la sortie d'impression ?

Pourquoi mon conteneur Python Docker détaché n'affiche-t-il pas la sortie d'impression ?

DDD
DDDoriginal
2024-12-06 20:30:16649parcourir

Why Doesn't My Detached Docker Python Container Show Print Output?

Comprendre le comportement d'impression dans les conteneurs Python Docker détachés

Dans les applications Python exécutées dans des conteneurs Docker détachés, vous pouvez rencontrer un manque de sortie lors de l'utilisation de l'instruction print. Ce problème survient lorsque les flux STDOUT et STDERR sont mis en mémoire tampon dans le conteneur.

Le problème

Lorsque vous exécutez une application Python (2.7) à l'aide du CMD de Docker ["python","main.py "], le script main.py s'initialise avec print "App démarré" et entre dans une boucle indéfinie. L'observation du conteneur avec l'indicateur -it affiche la sortie attendue dans les journaux du terminal et de Docker.

Cependant, l'utilisation de l'indicateur -d (mode détaché) lance le conteneur mais empêche la sortie attendue d'être visible dans le logs ou terminal.

La solution

Pour résoudre ce problème, l'option de sortie sans tampon de Python peut être utilisée. En modifiant le Dockerfile CMD en CMD ["python","-u","main.py"], la mise en mémoire tampon de STDOUT et STDERR est désactivée. Cela permet à Python d'imprimer immédiatement, rendant la sortie visible lors de l'interrogation des journaux Docker de mon application.

Pourquoi une sortie sans tampon ?

L'argument -u force Python à vider la sortie vers les flux standard sans attendre un tampon à remplir. Cela garantit que les impressions sont affichées rapidement, même lorsque le script est exécuté en arrière-plan.

Observations supplémentaires

Contrairement à l'impression, en utilisant la fonction logging.warning("text") du module de journalisation génère une sortie immédiate même sans mode sans tampon. En effet, la journalisation gère le vidage en interne.

La documentation Python pour l'option -u indique qu'elle supprime la mémoire tampon des flux STDOUT et STDERR, permettant l'affichage de la sortie en direct dans un conteneur détaché.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn