Redirigiendo la salida del comando en la ventanavienta -- linux campo con bash campo con logging campo con docker campo con output camp Relacionados El problema

Redirecting command output in docker


66
vote

problema

Español

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

Aquí está el archivo DOCER

  # 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, redirija 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 funcionando

No hay /srv/server.log

ps aux | grep python RENDIDOS:

  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 Cannot access field id on type 0 en el contenedor puedo ver la salida de generación de la aplicación en la consola.

¿Cómo redirpo adecuadamente STDOUT / ERR a un archivo cuando use Docker?

Original en ingles

I want to do some simple logging for my server which is a small Flask app running in a Docker container.

Here is the 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"] 

As you can see on the last line I redirect stderr and stdout to a file. Now I run this container and shell into it

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

And observe the following things:

The server is running and the website working

There is no /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 

But there are no logs... HOWEVER, if I docker attach to the container I can see the app generating output in the console.

How do I properly redirect stdout/err to a file when using Docker?

              

Lista de respuestas

66
 
vote
vote
La mejor respuesta
 

Cuando especifica una lista de JSON como ActiveSupport3 en un ActiveSupport4 , no se ejecutará en una cáscara, por lo que las funciones de Shell habitual, como la Redirección STDOUT y STDERR, no funcionará

de la Documentación :

El formulario EXEC está analizado como una matriz JSON, lo que significa que debe usar las comillas de doble punto ( 99887776615 ) alrededor de las palabras no se oponen a las cotizaciones únicas ( 99887776616 ). < / p>

A diferencia del formulario de cáscara, el formulario EXEC no invoca un shell de comandos. Esto significa que el procesamiento normal de la cáscara no sucede. Por ejemplo, ActiveSupport7 no realizará sustitución variable en ActiveSupport8 . Si desea procesamiento de cáscara, use el formulario de shell o ejecute un shell directamente, por ejemplo: ActiveSupport9 .

¿Qué hace realmente su comando es ejecutando su zones_map0 script y pasando las cadenas zones_map1 y zones_map2 como argumentos de línea de comandos en ese guión de Python .

Use uno de los siguientes (ambos deben funcionar):

  1. zones_map3
  2. zones_map4
 

When you specify a JSON list as CMD in a Dockerfile, it will not be executed in a shell, so the usual shell functions, like stdout and stderr redirection, won't work.

From the documentation:

The exec form is parsed as a JSON array, which means that you must use double-quotes (") around words not single-quotes (').

Unlike the shell form, the exec form does not invoke a command shell. This means that normal shell processing does not happen. For example, CMD [ "echo", "$HOME" ] will not do variable substitution on $HOME. If you want shell processing then either use the shell form or execute a shell directly, for example: CMD [ "sh", "-c", "echo", "$HOME" ].

What your command actually does is executing your index.py script and passing the strings "1>server.log" and "2>server.log" as command-line arguments into that python script.

Use one of the following instead (both should work):

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

Para usar zones_map5 en una tubería de cáscara o debajo de la redirección de Shell, lo que hace 99887776626 Aceptar STDIN y la salida a STdout y STDERR de manera adecuada, use este Encanto:

  zones_map7  

e.g. Para ejecutar la imagen zones_map8 y ejecutar el comando unix zones_map9 en el entorno contenido:

  NoMethodError: private method 'zones_map' called for ActiveSupport::TimeZone:Class 0  

emites:

  NoMethodError: private method 'zones_map' called for ActiveSupport::TimeZone:Class 1  
 

To use docker run in a shell pipeline or under shell redirection, making run accept stdin and output to stdout and stderr appropriately, use this incantation:

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

e.g. to run the alpine image and execute the UNIX command cat in the contained environment:

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:  

emits:

This is coming out of docker: This was piped into docker 
 
 
12
 
vote

Solo un complemento, al usar Docker-componer , también podría intentarlo:

NoMethodError: private method 'zones_map' called for ActiveSupport::TimeZone:Class 2

 

Just a complement, when using docker-compose, you could also try:

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

 
 
     
     
0
 
vote

Yo uso personalmente:

  NoMethodError: private method 'zones_map' called for ActiveSupport::TimeZone:Class 3  

la tecla "-u" es la clave :)

 

I personally use :

ENTRYPOINT ["python3"] CMD ["-u", "-m", "swagger_server"] 

The "-u" is the key :)

 
 

Relacionados problema

0  Potencia de comando GREP y úsela en la declaración "IF", Bash  ( Grep output of command and use it in if statement bash ) 
Está bien, así que aquí hay otro sobre el servidor StarMade. Anteriormente, tuve este script para detectar un choque, simplemente buscaría a través de los r...

1  Filtrado de líneas de salida que están entre ciertas líneas  ( Filtering output lines that are between certain lines ) 
Tengo un comando que lanza desde la cáscara de bash, que emite un montón de líneas. Quiero ver toda su salida, excepto las líneas entre líneas "buscando cam...

0  ¿Por qué los decoradores de Python hacen esto? Diferente salida?  ( Why do python decorators do this different output ) 
Soy relativamente Nuevo a python y estaba jugando con decoradores y me encontré atrapado en cómo explicar la producción que estaba recibiendo después de e...

2  SINTAX SPSS para nombrar análisis individuales en el esquema del archivo de salida  ( Spss syntax for naming individual analyses in output file outline ) 
He creado la sintaxis en SPSS que me da 90 iteraciones separadas del modelo lineal general, cada una con variaciones ligeramente diferentes Factores fijos y c...

2  Salida de impresión en tiempo real desde el subproceso  ( Printing output in realtime from subprocess ) 
Estoy tratando de imprimir STOUT en tiempo real para un subproceso, pero parece que STDOUT está tamponado incluso con Bufsize = 0 y no puedo averiguar cómo ha...

1  Python Heapq Ferge Ordenar no puede escribir en el archivo de salida  ( Python heapq merge sort not able to write to output file ) 
Estoy tratando de usar MEAPQ FIGE para fusionar un montón de archivos temporales llenos de enteros ordenados y escribir en un archivo de salida. El generador ...

0  Comparación entre tres parámetros  ( Comparison between three parameters ) 
Tengo una función en Python que dice que tengo que tomar en 3 parámetros y la palabra tiene que estar en la mano y la palabra también tiene que estar en la li...

0  Formato de salida XML en el archivo XML impreso con PHP [duplicado]  ( Format xml output in printed xml file with php ) 
Esta pregunta ya tiene respuestas aquí : PHP XML Cómo generar un buen formato ...

0  Salida cierta cadena en C ++  ( Output certain string in c ) 
Estoy haciendo este ejercicio: Escriba un programa para obtener un número N y una secuencia de números y caracteres. Como resultado, el programa debe gener...

0  Imagen de salida en Java  ( Outputting image in java ) 
He hecho un programa en Java que acepta una imagen en color y la convierte en la imagen de escala gris. La imagen se lee como un bufferedImage, los componente...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos