我发现tail -f
在 CoreOS 中的 Docker 容器内运行命令时出现了一些奇怪的行为。
我能想到的很多变量都可能导致了这个问题,但我不确定首先需要做什么来排除故障。在 CoreOS 上,我运行的是支持 overlayfs 的最新版本,以及较新版本的 Docker (1.4.1)。
有趣的是,我能够在运行不同版本 Docker(1.3)的不同主机操作系统(Ubuntu 14.04)上成功地跟踪日志。
如果这有助于排除故障,我可以生成 strace 日志,它们似乎在不同的主机上存在很大差异。例如,在不工作的主机上,在 strace 输出中读取以下内容后,strace 停止:
04:03:03 inotify_add_watch(4, "f017f0a1-a1e9-11e4-90bc-027e0f87cac6-paster.log", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 <0.000028>
04:03:03 fstat(3, {st_mode=S_IFREG|0644, st_size=12229, ...}) = 0 <0.000022>
04:03:03 read(4, 0x7711f0, 64) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) <3.101545>
我对 strace 不够熟悉,无法很好地解释结果。
答案1
这不是解决方案,而是一种解决方法:
我在 CoreOS 607.0.0 上遇到了同样的问题,并在基于 Ubuntu 或 Fedora 的容器中重现了此问题。但是使用 busybox 的容器没有这个问题。两种解决方法:
1)使用基于 busybox 的容器镜像,例如 alpine
2)在现有容器中安装 busybox 并运行
busybox tail -F <logfile>
答案2
这是一个漏洞在 CoreOS 561 中,当默认文件系统从 btrfs 更改为 overlayfs 时引入了此功能。我发现解决方法在主机首次启动时基本上使用 btrfs 格式化文件系统,目前看来这是可行的。
在您的 CloudInit 中包含以下内容:
#cloud-config
coreos:
units:
- name: format-var-lib-docker.service
command: start
content: |
[Unit]
Before=docker.service var-lib-docker.mount
ConditionPathExists=!/var/lib/docker.btrfs
[Service]
Type=oneshot
ExecStart=/usr/bin/truncate --size=25G /var/lib/docker.btrfs
ExecStart=/usr/sbin/mkfs.btrfs /var/lib/docker.btrfs
- name: var-lib-docker.mount
enable: true
content: |
[Unit]
Before=docker.service
After=format-var-lib-docker.service
Requires=format-var-lib-docker.service
[Install]
RequiredBy=docker.service
[Mount]
What=/var/lib/docker.btrfs
Where=/var/lib/docker
Type=btrfs
Options=loop,discard