Bonjour à tous,
Je suis coincé sur un comportement très vicieux. En effet, j'ai un bête micro-service en Flask, qui crée un thread puis appel un process externe via subprocess. Lorsque je le lance simplement via Gunicorn, tout fonctionne bien et je récupère tout les print dans stdout que je peux faire. Mais quand je le met dans un Docker et lance via Docker run, là je ne récupère plus les print après le subprocess !
Pour faire un exemple minimal, créer dans un même répertoire les 5 fichiers suivants :
app.py
1 2 3 4 5 6 7 8 9 10 11 12
|
from flask import Flask
from TestThread import TestThread
app = Flask(__name__)
VERSION = "1.0.0"
@app.route('/test', methods=['GET'])
def get_test():
TestThread('echo.sh').start()
return ('OK', 200) |
TestThread.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import subprocess
from subprocess import PIPE
from threading import Thread
class TestThread(Thread):
def __init__(self, script):
Thread.__init__(self)
Thread.script = script
def run(self):
print("Test thread: start")
try:
print(subprocess.check_output(['sh', self.script],
stderr=PIPE).decode("utf-8"))
print("Test thread: ended")
except subprocess.CalledProcessError as e:
print("Erreur")
print(e.output.decode("utf-8")) |
echo.sh
launch.sh
1 2 3
| #!/usr/bin/env sh
cd /opt/testThread/
gunicorn3 --access-logfile - --error-logfile - -b 0.0.0.0:2500 app:app |
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| FROM debian:bullseye
RUN apt update && apt install -y python3 \
python3-pip gunicorn3 \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/testThread
WORKDIR /opt/testThread
RUN pip3 install flask
ADD app.py /opt/testThread/
ADD TestThread.py /opt/testThread/
ADD echo.sh /opt/testThread/
ADD ./launch.sh /opt/testThread/
RUN chmod +x launch.sh
EXPOSE 2500
CMD ["/opt/testThread/launch.sh"] |
Maintenant faire simplement un docker build . -t testthread dans le répertoire.
Si je fais un docker run -it -p 2500:2500 testthread:latest bash et maintenant dans le docker ./launch.sh, je curl http://127.0.0.1:2500/test et j'ai bien tous mes messages d'affichés dans la sortie standard :
Test thread: start
The shell script
Test thread: ended
Donc c'est parfait.
Mais si maintenant je fais un docker run -p 2500:2500 testthread:latest, je curl http://127.0.0.1:2500/test et là le seul message qui est affiché est
Test thread: start
Pourquoi est-ce que les 2 autres messages ne sortent pas dans la stdout de Docker ? Quelqu'un a-t-il une idée ?
Partager