Juste un complément, lors de l'utilisation de docker-compose , vous pouvez également essayer :
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Lorsque vous spécifiez une liste JSON en tant que CMD
dans un Dockerfile
, il ne sera pas exécuté dans un shell, donc les fonctions habituelles du shell, comme la redirection stdout et stderr, ne fonctionneront pas.
À partir de la documentation :
Le formulaire exec est analysé comme un tableau JSON, ce qui signifie que vous devez utiliser des guillemets doubles (
"
) autour des mots et non des guillemets simples ('
).Contrairement au formulaire shell, le formulaire exec n'invoque pas de shell de commande. Cela signifie que le traitement normal du shell ne se produit pas. Par exemple,
CMD [ "echo", "$HOME" ]
ne fera pas de substitution de variable sur$HOME
. Si vous souhaitez un traitement shell, utilisez le formulaire shell ou exécutez un shell directement, par exemple :CMD [ "sh", "-c", "echo", "$HOME" ]
.
Ce que fait réellement votre commande, c'est exécuter votre index.py
script et en passant les chaînes "1>server.log"
et "2>server.log"
comme arguments de ligne de commande dans ce script python .
Utilisez plutôt l'une des options suivantes (les deux devraient fonctionner) :
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Pour utiliser docker run
dans un pipeline shell ou sous redirection shell, faisant run
accepter stdin et sortir vers stdout et stderr de manière appropriée, utilisez cette incantation :
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
par exemple. pour exécuter le alpine
image et exécutez la commande UNIX cat
dans l'environnement confiné :
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:
émet :
This is coming out of docker: This was piped into docker