GNU/Linux >> Znalost Linux >  >> Linux

Přesměrování výstupu příkazu v dockeru

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

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

Linux
  1. Jak přiřadit výstup příkazu proměnné shellu?

  2. Ukládání výstupu příkazu do proměnné Shell?

  3. Jaký je rozdíl mezi získáním výstupu příkazu pomocí `command` a $(command) v Shell?

  1. Jak zjistit, zda je výstup příkazového nebo shellového skriptu Stdout nebo Stderr?

  2. Zobrazení úplného výstupu příkazu PS

  3. Převeďte výstup na řetězec

  1. Jak odstranit první/poslední „n“ řádky z výstupu příkazu v prostředí Shell?

  2. Získejte první řádek výstupu příkazu shellu

  3. Skrýt výstup příkazu shellu pouze při úspěchu?