Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

198
Views
Por qué no puedo obtener la salida de la cola de un archivo creado por docker build

Información acoplable:

 Containers: 18 Running: 18 Paused: 0 Stopped: 0 Images: 188 Server Version: 1.13.1 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1 runc version: 9df8b306d01f59d3a8029be411de015b7304dd8f init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 4.9.0-1-amd64 Operating System: Debian GNU/Linux 9 (stretch) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 15.56 GiB Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ WARNING: No swap limit support Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false

Versión de Docker: Docker version 1.13.1, build 092cba372

Tengo este archivo docker:

 FROM debian:latest RUN touch /var/log/mylog.log CMD ["tail", "-F", "/var/log/mylog.log"]

Compilándolo con docker build . -t test/test y ejecutarlo con docker run -ti test/test seguirá el archivo en stdout de esta manera (ignore la advertencia de cola):

 $ docker run --name test -t test/test tail: unrecognized file system type 0x794c7630 for '/var/log/mylog.log'. please report this to bug-coreutils@gnu.org. reverting to polling

Ejecutar el siguiente comando escribirá en el archivo /var/log/mylog.log , que es un archivo seguido por tail :

 docker exec -ti test bash -c "echo 'asd' >> /var/log/mylog.log"

Desafortunadamente, no hay salida en la otra terminal, incluso si cat muestra que hay contenido en el archivo:

 $ docker exec -ti test bash -c "cat /var/log/mylog.log" asd

Aunque, si creo el archivo con PID1 en lugar de crearlo dentro del dockerfile, puedo ver el contenido del archivo con la cola. También puedo obtener el contenido de la cola si docker stop test && docker start test con comandos anteriores.

¿Qué está pasando exactamente? ¿Hay algo diferente al crear archivos en la compilación de la ventana acoplable frente al script en ejecución en el contenedor en vivo?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Me ocurre el mismo problema al usar el controlador de almacenamiento overlay2 en la versión Docker 4.9.8-moby Alpine.

Parece que la CMD tail está abriendo el archivo /var/log/mylog.log desde la capa superpuesta que crea RUN touch /var/log/mylog.log .

Cuando agrega al registro, se crea un archivo "nuevo" en la capa de superposición superior que el contenedor usa para cualquier cambio en el sistema de archivos realizado en la parte superior de la imagen durante la ejecución, y este nuevo archivo en realidad se agrega. Sin embargo, tail no puede captar el cambio correctamente, ya sea con -f o -F .

El docker start y la docker stop resuelven el problema, ya que el proceso /var/log/mylog.log tail ha actualizado y luego apunta al archivo "nuevo" en la capa de superposición del contenedor. El uso de un CMD ligeramente diferente solucionaría el problema de manera similar:

 CMD ["sh", "-c", "touch /var/log/mylog.log && tail -f /var/log/mylog.log"]

La imagen debian:testing incluye coreutils-8.26-2 con la solución para admitir el número mágico de superposiciones para eliminar ese mensaje de advertencia, pero sigue mostrando el mismo comportamiento.

Lo más probable es que se solucione un problema de superposición en el núcleo. coreutils podría solucionar el problema al usar -F .

Sin embargo, lo que está intentando es un caso extremo en Docker. Los contenedores que usan tail como proceso de primer plano generalmente completan un montón de trabajo en un script antes de ejecutar tail , lo que incluye ejecutar los comandos que crean el archivo de registro que se seguirá. Puede ser por eso que no muchas personas han recogido esto.

over 4 years ago · Santiago Trujillo Report

0

Su sintaxis CMD json no es válida, le faltan comas. De lo contrario, funciona bien en mi entorno:

 $ cat df.tail FROM debian:latest RUN touch /var/log/mylog.log CMD ["tail", "-F", "/var/log/mylog.log"] $ docker build -t test-tail -f df.tail . Sending build context to Docker daemon 265.7 kB Step 1/3 : FROM debian:latest ---> 7b0a06c805e8 Step 2/3 : RUN touch /var/log/mylog.log ---> Using cache ---> 412295d58dc8 Step 3/3 : CMD tail -F /var/log/mylog.log ---> Using cache ---> d7e9c7fee4a0 Successfully built d7e9c7fee4a0 $ docker run -t --rm --name test-tail test-tail asd ^C $

Desde una segunda ventana, esto se ejecutó después del comando de ejecución de la ventana acoplable anterior:

 $ docker exec test-tail bash -c "echo 'asd' >> /var/log/mylog.log"
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!