gpt4 book ai didi

docker - 为什么我无法获得 docker build 创建的文件的尾部输出

转载 作者:IT老高 更新时间:2023-10-28 21:35:34 25 4
gpt4 key购买 nike

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 版本 1.13.1,构建 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 运行它将像这样在标准输出中拖尾文件(忽略尾警告):

$ 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 容器中运行脚本时有什么不同吗?

最佳答案

在 Docker 4.9.8-moby Alpine 版本上使用 overlay2 存储驱动程序时,我也会遇到同样的问题。

似乎 CMD tail 正在从 RUN touch/var/log/mylog 的覆盖层打开 /var/log/mylog.log 文件.log 创建。

当您附加到日志时,会在最顶层的覆盖层中创建一个"new"文件,容器用于在运行时对镜像顶部进行的任何文件系统更改,并且这个新文件实际上是附加到的。 tail 不能正确地进行转换,使用 -f-F

docker startdocker stop 解决了问题,因为 tail 进程在 /var/log/mylog 之后再次启动。 log 已更新,然后指向容器覆盖层中的"new"文件。使用稍有不同的 CMD 会以类似的方式解决该问题:

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

debian:testing 镜像包含 coreutils-8.26-2 以及支持覆盖魔数(Magic Number)以删除该警告消息的修复程序,但仍表现出相同的行为。

这很可能是内核中修复的覆盖问题。使用 -F 时,coreutils 可能能够解决此问题。

不过,您正在尝试的是 Docker 中的一个边缘案例。使用 tail 作为前台进程的容器通常在运行 tail 之前在脚本中完成一堆工作,其中包括运行创建要跟踪的日志文件的命令。可能是为什么没有多少人选择这个。

关于docker - 为什么我无法获得 docker build 创建的文件的尾部输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com