作者:艹丶马化腾_323 | 来源:互联网 | 2023-02-09 20:16
Docker信息:
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
Docker版本: Docker version 1.13.1, build 092cba372
我有这个docker文件:
FROM debian:latest
RUN touch /var/log/mylog.log
CMD ["tail", "-F", "/var/log/mylog.log"]
使用它来构建它docker build . -t test/test
并将它运行docker run -ti test/test
在这样的stdout中(忽略尾部警告):
$ 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
执行以下命令将写入文件/var/log/mylog.log
,该文件是后面跟着的文件tail
:
docker exec -ti test bash -c "echo 'asd' >> /var/log/mylog.log"
不幸的是,即使cat
显示文件中有内容,其他终端也没有输出:
$ docker exec -ti test bash -c "cat /var/log/mylog.log"
asd
虽然,如果我使用PID1创建文件而不是在dockerfile中创建它,我会看到带尾部的文件内容.如果我docker stop test && docker start test
使用之前的命令,我也可以获得尾部的内容.
到底发生了什么?在docker build中创建文件与live容器中的运行脚本有什么不同吗?
1> Matt..:
我overlay2
在Docker 4.9.8-moby
Alpine版本上使用存储驱动程序时出现同样的问题.
好像CMD tail
是/var/log/mylog.log
从RUN touch /var/log/mylog.log
创建的覆盖层打开文件.
当您追加到日志时,会在最顶层的覆盖层中创建一个"新"文件,容器在运行时用于对图像顶部进行的任何文件系统更改,并且实际上正在附加此新文件.tail
无法正确接收转换,使用-f
或者-F
.
该docker start
和docker stop
为解决问题tail
过程开始后再次/var/log/mylog.log
进行了更新,然后在容器覆盖层中的"新"的文件指出.稍微不同CMD
会以类似的方式解决问题:
CMD ["sh", "-c", "touch /var/log/mylog.log && tail -f /var/log/mylog.log"]
该debian:testing
图像包括coreutils-8.26-2,其中包含用于支持叠加幻数的修复程序以删除该警告消息,但仍然表现出相同的行为.
这很可能是在内核中修复的重叠问题.coreutils可能能够在使用时解决问题-F
.
你在尝试的是Docker中的一个边缘案例.tail
用作前台进程的容器通常在运行之前在脚本中完成大量工作tail
,其中包括运行创建要挂起的日志文件的命令.可能是为什么很多人都没有选择这个.