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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
echo 'The shell script'
launch.sh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
#!/usr/bin/env sh
cd /opt/testThread/
gunicorn3 --access-logfile - --error-logfile - -b 0.0.0.0:2500 app:app
Dockerfile
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?