Redirecionando a saída de comando no docker

5

Eu quero fazer alguns registros simples para o meu servidor, que é um pequeno aplicativo Flask em execução em um contêiner Docker.

Aqui está o 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"]

Como você pode ver na última linha, eu redireciono stderr e stdout para um arquivo. Agora eu corro este container e entro nele

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

E observe o seguinte:

O servidor está em execução e o site está funcionando

Não há /srv/server.log

ps aux | grep python yields:

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

Mas não há registros ... CONTUDO, se eu docker attach para o contêiner eu posso ver o aplicativo gerando saída no console.

Como eu redireciono corretamente o stdout / err para um arquivo ao usar o Docker?

    
por Dreen 04.01.2016 / 14:57

4 respostas

4

Gostaria de questionar seu caso de uso. Por que você precisa redirecionar stderr / stdout para um arquivo de log no contêiner? Stderr e stdout mesclados estão disponíveis fora do contêiner usando "logs docker", e eles podem ser redirecionados para um arquivo (fora do contêiner). Mais detalhes podem ser encontrados aqui

    
por 19.01.2016 / 15:15
2

Veja algumas informações sobre um caso de uso relacionado: Você deseja redirecionar a saída dentro do contêiner, que está sendo executado no Docker Cloud.

No meu caso, estou executando um script de análise de dados de longa duração (Java) no Docker Cloud. Cada contêiner deve gravar seu próprio arquivo de resultados. Estou usando a imagem java:8-jre e sobrescrevo o comando "Executar" com a seguinte linha:

bash -c "java -jar /code/analyzer.jar > /data/results-$RANDOM.txt"

Usando a variável $RANDOM do bash, posso aumentar o número de contêineres no Docker Cloud o quanto eu quiser, enquanto ainda coleciono os resultados individualmente.

    
por 05.04.2016 / 23:52
0

Você está procurando tee

LOGFILE="logthis.txt";
IMG_alpine="alpine:3.5";

docker run --rm \
--name alpine-hello \
--hostname alpine-hello \
"$IMG_alpine" \
uname -a | tee -a $LOGFILE

cat logthis.txt
Linux alpine-hello 4.8.14-docker-2 #1 SMP Tue Jan 10 15:35:02 UTC 2017 x86_64 Linux
    
por 19.02.2017 / 22:43
0

Para usar docker run em um pipeline de shell ou sob redirecionamento de shell, fazendo run aceitar stdin e output para stdout e stderr apropriadamente, use este encantamento:

docker run -i --log-driver=none -a stdin -a stdout -a stderr ...

por exemplo. para executar a imagem alpine e executar o comando cat do UNIX no ambiente contido:

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
    
por 03.05.2018 / 19:58