Cómo leer archivos y stdout desde un contenedor Docker en ejecución

78

¿Cómo iniciaría una aplicación en mi máquina host para leer archivos y stdout desde un contenedor docker en ejecución?

Esencialmente quiero hacer esto:

docker start containerid   
./myapp // This app will *somehow* have access files and stdout generated by the container I just stared. 

¿Cómo haría yo para hacer eso? Para ser más específico con respecto a dónde estoy tratando de llegar con esto; Quiero leer los registros y la salida estándar de un contenedor acoplable y hacer que esos registros se procesen en otro lugar.

También estoy dispuesto a crear otro contenedor docker que pueda leer archivos y stdout de otro contenedor, pero no sé si eso es posible.

rexposadas
fuente

Respuestas:

119

La salida estándar del proceso iniciado por el contenedor de la ventana acoplable está disponible a través del docker logs $containeridcomando (utilícelo -fpara que siga funcionando para siempre). Otra opción sería transmitir los registros directamente a través de la API remota de Docker .

Para acceder a los archivos de registro (solo si debe hacerlo, considere iniciar sesión en stdout u otra solución estándar como syslogd) su única opción en tiempo real es configurar un volumen (como sugiere Marcus Hughes) para que los registros se almacenen fuera del contenedor y estén disponibles para su procesamiento. del anfitrión o de otro contenedor.

Si no necesita acceso en tiempo real a los registros, puede exportar los archivos (en formato tar) condocker export

Abel Muiño
fuente
1
Buen descubrimiento. Parece que los registros de contenedores de relaves se introdujeron en la versión 1.1.0
rexposadas
@rexposadas, la -fopción ha existido durante mucho tiempo (en la escala de tiempo de Docker, de todos modos). Al menos 7 meses según este número: github.com/dotcloud/docker/issues/2997
Abel Muiño
Hemos configurado un Cloudwatch que almacena muy bien algunos registros, pero no almacena los registros estándar. Su solución ha funcionado, podríamos ver estos registros ejecutando el comando docker logs, pero ¿cómo podemos seguir empujándolo a Cloudwatch?
Ondrej Tokar
1
@OndrejTokar No estoy familiarizado con Cloudwatch, pero puede canalizar el docker logscomando a un archivo y observar ese archivo, o hacerlo directamente en el contenedor y exponer el archivo de registro como un volumen.
Abel Muiño
1
@OndrejTokar, supongo que te refieres a la unidad awslogs ( docs.docker.com/engine/admin/logging/awslogs ). Publique aquí en caso de que otros estén interesados.
Wanghq
16

Para ver la salida estándar, puede iniciar el contenedor de la ventana acoplable con -i. Por supuesto, esto no le permite dejar el proceso iniciado y explorar el contenedor.

docker start -i containerid

Alternativamente, puede ver el sistema de archivos del contenedor en

/var/lib/docker/containers/containerid/root/

Sin embargo, ninguno de estos es ideal. Si desea ver registros o cualquier almacenamiento persistente, la forma correcta de hacerlo sería adjuntando un volumen con el -vinterruptor cuando lo use docker run. Esto significaría que puede inspeccionar los archivos de registro en el host o adjuntarlos a otro contenedor e inspeccionarlos allí.

Marcus Hughes
fuente
6

Un poco tarde, pero esto es lo que estoy haciendo journald. Es bastante poderoso.

Debe ejecutar sus contenedores docker en un sistema operativo con systemd-journald.

docker run -d --log-driver=journald myapp

Esto canaliza todo al diario del host, que se ocupa de cosas como la poda de registros, el formato de almacenamiento, etc. y le brinda algunas opciones interesantes para verlos:

journalctl CONTAINER_NAME=myapp -f

que lo enviará a su consola a medida que se registre,

journalctl CONTAINER_NAME=myapp > output.log

que le da todo en un archivo para llevar, o

journalctl CONTAINER_NAME=myapp --since=17:45

Además, aún puede ver los registros a través de docker logs ....si esa es su preferencia.

No más > my.logo -v "/apps/myapp/logs:/logs"etc

Adán
fuente
1
¡Esta es la mejor respuesta de todas!
Basit Anwer
4

El uso compartido de archivos entre un contenedor de la ventana acoplable y el sistema host, o entre contenedores separados, se logra mejor utilizando volúmenes .

Tener su aplicación ejecutándose en otro contenedor es probablemente su mejor solución, ya que garantizará que toda su aplicación se pueda aislar y desplegar fácilmente. Lo que estás intentando hacer suena muy parecido a la configuración descrita en esta excelente publicación de blog , ¡échale un vistazo!

Jules Olléon
fuente
Gracias por la sugerencia. El uso de volúmenes probablemente no sea una opción. No quiero tener que decirle a un creador de imágenes que almacene sus registros en un volumen / directorio específico. El objetivo era leer archivos de registro dondequiera que el creador de la aplicación los escriba.
rexposadas
4

Puede ver el sistema de archivos del contenedor en

/var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/

y puedes simplemente

tail -f mylogfile.log
maestr0
fuente
3
Esos directorios están vacíos para mí
cdmckay
Para los usuarios de OSX, esta ubicación estará vacía porque la ventana acoplable se ejecutará en la VM boot2docker, por lo que tendría que buscar en esa ubicación en la VM.
Michael Barton
En OSX, los registros podrían estar en ~ / Library / Containers / com.docker.docker / Data / com.docker.driver.amd64-linux / log / docker.log . Estoy usando Docker 1.12.3.
Wanghq
2
En mi situación, encontré el registro en: /var/lib/docker/containers/<containerID>/<containerID>-json.log
cs94njw