tuberias texto salidas salida redirigir pipes operador guardar filtros fichero estandar enviar comandos comando archivo linux bash logging docker output

linux - texto - Redirigir salida de comando en la ventana acoplable



salidas estandar en linux (3)

Quiero hacer un registro simple para mi servidor, que es una pequeña aplicación Flask que se ejecuta en un contenedor Docker.

Aquí está el archivo Docker

# 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 puede ver en la última línea, redirijo stderr y stdout a un archivo. Ahora ejecuto este contenedor y shell en él

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

Y observe las siguientes cosas:

El servidor se está ejecutando y el sitio web funciona

No hay /srv/server.log

ps aux | grep python 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

Pero no hay registros ... SIN EMBARGO, si hago docker attach al contenedor, puedo ver la aplicación que genera la salida en la consola.

¿Cómo redireccio correctamente stdout / err a un archivo cuando uso Docker?


Como complemento, al usar Docker-Componer , también puedes probar:

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


Cuando especifica una lista JSON como CMD en un Dockerfile , no se ejecutará en un shell, por lo que las funciones habituales del shell, como la redirección stdout y stderr, no funcionarán.

De la documentation :

El formulario ejecutivo se analiza como una matriz JSON, lo que significa que debe usar comillas dobles ( " ) alrededor de palabras que no sean comillas simples ( '' ).

A diferencia de la forma de shell, el formulario de ejecución no invoca un shell de comando. Esto significa que el procesamiento de shell normal no ocurre. Por ejemplo, CMD [ "echo", "$HOME" ] no hará sustitución de variables en $HOME . Si desea un procesamiento de shell, utilice el formulario de shell o ejecute un shell directamente, por ejemplo: CMD [ "sh", "-c", "echo", "$HOME" ] .

Lo que su comando realmente hace es ejecutar su script index.py y pasar las cadenas "1>server.log" y "2>server.log" como argumentos de línea de comandos en ese script de python .

Use uno de los siguientes en su lugar (ambos deberían funcionar):

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

Para utilizar la docker run en una canalización de shell o en la redirección de shell, hacer que la run acepte stdin y salir a stdout y stderr de manera apropiada, use este encantamiento:

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

por ejemplo, para ejecutar la imagen alpine y ejecutar el comando cat UNIX en el entorno contenido:

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