Jen doplněk při použití docker-compose , můžete také zkusit:
command: bash -c "script_or_command > /path/to/log/command.log 2>&1"
Když zadáte seznam JSON jako CMD
v Dockerfile
, nebude spuštěn v shellu, takže obvyklé funkce shellu, jako je přesměrování stdout a stderr, nebudou fungovat.
Z dokumentace:
Formulář exec je analyzován jako pole JSON, což znamená, že musíte použít dvojité uvozovky (
"
) kolem slov nikoli v jednoduchých uvozovkách ('
).Na rozdíl od shellového formuláře, exec formulář nevyvolá příkazový shell. To znamená, že normální zpracování shellu neproběhne. Například
CMD [ "echo", "$HOME" ]
neprovede substituci proměnných na$HOME
. Pokud chcete zpracování shellu, použijte buď formulář shellu, nebo spusťte shell přímo, například:CMD [ "sh", "-c", "echo", "$HOME" ]
.
Váš příkaz ve skutečnosti provede spuštění vašeho index.py
skript a předání řetězců "1>server.log"
a "2>server.log"
jako argumenty příkazového řádku do tohoto python skriptu .
Místo toho použijte jeden z následujících (obě by měly fungovat):
CMD "python index.py > server.log 2>&1"
CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
Chcete-li použít docker run
v potrubí shellu nebo pod přesměrováním shellu, takže run
přijměte stdin a odpovídajícím způsobem vystupte do stdout a stderr, použijte toto zaklínadlo:
docker run -i --log-driver=none -a stdin -a stdout -a stderr ...
např. ke spuštění alpine
image a spusťte UNIXový příkaz cat
v uzavřeném prostředí:
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:
vydává:
This is coming out of docker: This was piped into docker