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