Solo un complemento, al usar docker-compose , también puedes probar:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Cuando especifica una lista JSON como CMD
en un Dockerfile
, no se ejecutará en un shell, por lo que las funciones habituales del shell, como la redirección stdout y stderr, no funcionarán.
De la documentación:
El formulario exec se analiza como una matriz JSON, lo que significa que debe usar comillas dobles ("
) alrededor de palabras sin comillas simples ('
).
A diferencia del formulario de shell, el formulario exec no invoca un shell de comandos. Esto significa que el procesamiento de shell normal no ocurre. Por ejemplo, CMD [ "echo", "$HOME" ]
no hará sustitución de variables en $HOME
. Si desea un procesamiento de shell, utilice el formulario de shell o ejecute un shell directamente, por ejemplo:CMD [ "sh", "-c", "echo", "$HOME" ]
.
Lo que tu comando realmente hace es ejecutar tu index.py
script y pasando las cadenas "1>server.log"
y "2>server.log"
como argumentos de la línea de comandos en ese script de Python .
Utilice uno de los siguientes en su lugar (ambos deberían funcionar):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Para usar docker run
en una canalización de shell o bajo redirección de shell, haciendo run
acepta stdin y salida a stdout y stderr apropiadamente, usa este conjuro:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
p.ej. para ejecutar el alpine
imagen y ejecute el comando UNIX cat
en el entorno contenido:
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:
emite:
This is coming out of docker: This was piped into docker