2016-01-06 32 views
23

Desidero eseguire alcune semplici operazioni di registrazione per il mio server, che è una piccola app Flask in esecuzione in un contenitore Docker.Reindirizzamento dell'output dei comandi nella finestra mobile

Ecco la Dockerfile

# Dockerfile 
FROM dreen/flask 
MAINTAINER dreen 
WORKDIR /srv 

# Get source 
RUN mkdir -p /srv 
COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz 
RUN tar x -f perfektimprezy.tar.gz 
RUN rm perfektimprezy.tar.gz 

# Run server 
EXPOSE 80 
CMD ["python", "index.py", "1>server.log", "2>server.log"] 

Come si può vedere l'ultima linea di I reindirizzare stderr e stdout in un file. Ora corro questo contenitore e Shell in esso

docker run -d -p 80:80 perfektimprezy 
docker exec -it "... id of container ..." bash 

e osservare le seguenti cose:

Il server è in esecuzione e il sito di lavoro

Non ci sono /srv/server.log

ps aux | grep python rendimenti:

root   1 1.6 3.2 54172 16240 ?  Ss 13:43 0:00 python index.py 1>server.log 2>server.log 
root  12 1.9 3.3 130388 16740 ?  Sl 13:43 0:00 /usr/bin/python index.py 1>server.log 2>server.log 
root  32 0.0 0.0 8860 388 ?  R+ 13:43 0:00 grep --color=auto python 

Ma ci ar e nessun registro ... TUTTAVIA, se ho docker attach nel contenitore posso vedere l'uscita di generazione di app nella console.

Come reindirizzare correttamente lo stdout/err su un file quando si utilizza la finestra mobile?

risposta

23

Quando si specifica un elenco JSON come CMD in un Dockerfile, non verrà eseguito in una shell, quindi le normali funzioni di shell, come il reindirizzamento stderr e stderr, non funzioneranno.

Dal documentation:

La forma exec viene analizzato come un array JSON, il che significa che è necessario utilizzare le virgolette doppie (") intorno le parole non-virgolette singole (').

A differenza del modulo di shell, il modulo exec non richiama una shell di comandi. Ciò significa che la normale elaborazione della shell non avviene. Ad esempio, CMD [ "echo", "$HOME" ] non eseguirà la sostituzione delle variabili su $HOME. Se si desidera elaborare la shell, utilizzare il modulo di shell o eseguire direttamente una shell, ad esempio: CMD [ "sh", "-c", "echo", "$HOME" ].

Che cosa il vostro comando non è in realtà eseguendo lo script index.py e passando le corde "1>server.log" e "2>server.log" come argomenti della riga di comando in quel script python.

utilizzare uno dei seguenti invece (entrambi dovrebbero funzionare):

  1. CMD "python index.py > server.log 2>&1"
  2. CMD ["/bin/sh", "-c", "python index.py > server.log 2>&1"]
+0

vedere anche https://github.com/docker/docker/issues/7440 – user2915097

+2

La [documentazione] (https: //docs.docker.com/engine/reference/builder/# shell-form-entrypoint-example) raccomanda l'uso della shell 'exec' integrata per fare in modo che i contenitori rispettino i segnali del sistema operativo e' docker stop'. Quindi il primo comando diventa: 'CMD exec python index.py> server.log 2> & 1' – lucian

4

Solo un complemento, quando si utilizza finestra mobile-comporre, si potrebbe anche provare:

command: bash -c "script_or_command > /path/to/log/command.log 2>&1"

+0

Hai provato? Questo ha perfettamente senso per me e non funziona! Fino ad ora non sono riuscito a reindirizzare lo stderr allo stdout quando si utilizzava una direttiva 'command' di docker-compose. stdout passa attraverso bene. –

+0

Sì, ha funzionato perfettamente per me. –

+0

Ah, il mio problema è che avevo bisogno di impostare la variabile di ambiente 'PYTHONUNBUFFERED' o di eseguire python con il flag' -u', come questo spiega: http://stackoverflow.com/a/24183941/562883 –

Problemi correlati