Nur eine Ergänzung, wenn Sie docker-compose verwenden , könnten Sie auch versuchen:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Wenn Sie eine JSON-Liste als CMD
angeben in einem Dockerfile
, wird es nicht in einer Shell ausgeführt, daher funktionieren die üblichen Shell-Funktionen wie stdout und stderr-Umleitung nicht.
Aus der Dokumentation:
Das Exec-Formular wird als JSON-Array geparst, was bedeutet, dass Sie doppelte Anführungszeichen verwenden müssen ("
) um Wörter herum, nicht in einfache Anführungszeichen ('
).
Im Gegensatz zum Shell-Formular ruft das Exec-Formular keine Befehlsshell auf. Dies bedeutet, dass keine normale Shell-Verarbeitung stattfindet. Beispiel:CMD [ "echo", "$HOME" ]
führt keine Variablenersetzung auf $HOME
durch . Wenn Sie eine Shell-Verarbeitung wünschen, verwenden Sie entweder das Shell-Formular oder führen Sie direkt eine Shell aus, zum Beispiel:CMD [ "sh", "-c", "echo", "$HOME" ]
.
Was Ihr Befehl tatsächlich tut, ist das Ausführen Ihres index.py
-Skript und Übergeben der Zeichenfolgen "1>server.log"
und "2>server.log"
als Befehlszeilenargumente in dieses Python-Skript .
Verwenden Sie stattdessen eines der folgenden (beide sollten funktionieren):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Um docker run
zu verwenden in einer Shell-Pipeline oder unter Shell-Umleitung, wodurch run
entsteht stdin akzeptieren und entsprechend auf stdout und stderr ausgeben, verwenden Sie diese Beschwörung:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
z.B. um alpine
auszuführen image und führen Sie den UNIX-Befehl cat
aus in der geschlossenen Umgebung:
echo "This was piped into docker" |
docker run -i --log-driver=none -a stdin -a stdout -a stderr \
alpine cat - |
xargs echo This is coming out of docker:
gibt aus:
This is coming out of docker: This was piped into docker