GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Befehlsausgabe im Docker umleiten

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):

  1. CMD "python index.py > server.log 2>&1"
  2. 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

Linux
  1. Wie lösche ich die ersten/letzten 'n' Zeilen aus der Befehlsausgabe in der Shell?

  2. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  3. Ausgabe des Befehls in Shell-Variable speichern?

  4. Wie kann man feststellen, ob die Ausgabe eines Befehls oder Shell-Skripts Stdout oder Stderr ist?

  5. Docker-Befehl nicht gefunden

Quellbefehl unter Linux

So führen Sie Shell-Befehle über einen HTTP-Server aus

Ccat – Cat-Befehlsausgabe einfärben

So leiten Sie die Shell-Befehlsausgabe um

Kommando-Shell

Quellbefehl unter Linux erklärt