Solo un complemento, quando si utilizza docker-compose , potresti anche provare:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Quando specifichi un elenco JSON come CMD
in un Dockerfile
, non verrà eseguito in una shell, quindi le normali funzioni della shell, come il reindirizzamento stdout e stderr, non funzioneranno.
Dalla documentazione:
Il formato exec viene analizzato come un array JSON, il che significa che devi usare le virgolette (
"
) attorno a parole non virgolette singole ('
).A differenza del modulo shell, il modulo exec non richiama una shell di comando. Ciò significa che la normale elaborazione della shell non avviene. Ad esempio,
CMD [ "echo", "$HOME" ]
non eseguirà la sostituzione delle variabili su$HOME
. Se desideri l'elaborazione della shell, usa il modulo shell o esegui direttamente una shell, ad esempio:CMD [ "sh", "-c", "echo", "$HOME" ]
.
Ciò che fa effettivamente il tuo comando è eseguire il tuo index.py
script e passando le stringhe "1>server.log"
e "2>server.log"
come argomenti della riga di comando in quello script python .
Usa invece uno dei seguenti (entrambi dovrebbero funzionare):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Per utilizzare docker run
in una pipeline della shell o sotto il reindirizzamento della shell, creando run
accetta stdin e l'output su stdout e stderr in modo appropriato, usa questo incantesimo:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
per esempio. per eseguire alpine
image ed eseguire il comando UNIX cat
nell'ambiente contenuto:
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:
emette:
This is coming out of docker: This was piped into docker