当前位置: 首页 > 面试题库 >

在docker CMD末尾的`tail -f`输出未显示

益银龙
2023-03-14
问题内容

将Docker for Mac 1.13.1与以下Dockerfile一起使用:

FROM ubuntu:latest
MAINTAINER docker@ekito.fr

#Install packages and clean downloaded packages in the lowest layer
RUN apt-get update && apt-get -y install cron && rm -rf /var/lib/apt/lists/*

# Add crontab file in the cron directory
ADD crontab /etc/cron.d/hello-cron

# Give execution rights on the cron job and create the log file to tail in the next layer
RUN chmod 0644 /etc/cron.d/hello-cron && touch /var/log/cron.log

# Run the command on container startup
CMD echo "starting" && echo "continuing" && (cron) && echo "tailing..."  && tail -f /var/log/cron.log

使用以下内容的contab文件:

* * * * * root echo "Hello world `date`" >> /var/log/cron.log 2>&1
# Don't remove the empty line at the end of this file. It is required to run the cron job

当我使用以下命令构建和运行它时:

docker build -t docker-cron-master .
docker run docker-cron-master

我看到输出:

docker run docker-cron-master
starting
continuing
tailing...

如果我等待一分钟,tail -f则不会出现输出。但是,如果我登录到正在运行的容器并拖尾文件,则可以看到内容:

$ docker exec -it 4eda6b1fc6ce bash
root@4eda6b1fc6ce:/# tail -f /var/log/cron.log
Hello world Fri May  5 09:53:01 UTC 2017
Hello world Fri May  5 09:54:01 UTC 2017

我尝试在CMD的末尾添加另一个回显,以查看是否只是吞没了STDOUT的最后一个命令,但这没有帮助。

我已经将代码发布在github上的https://github.com/simbo1905/docker-
cron

谢谢!


问题答案:

docker文件系统使用分层复制fs进行写时复制。因此,当您写入图像的一部分时,它将首先将该文件复制到容器文件系统,该文件系统位于所有图像层之上。

这意味着当您在/var/log/cron.log中添加一行时,它将在文件系统中获得一个新的inode,并且该tail命令所遵循的文件不再是您docker exec进入容器时看到的文件。您可以通过较小的更改来解决该问题,将“ nothing”附加到文件中,这还会修改最后的更新时间戳,从而强制执行写时复制:

CMD echo "starting" && echo "continuing" && (cron) \
 && echo "tailing..." && : >> /var/log/cron.log && tail -f /var/log/cron.log

我整理了一个要点,来解决这个问题,这里有更多详细信息:https : //gist.github.com/sudo-
bmitch/f91a943174d6aff5a57904485670a9eb



 类似资料:
  • 问题内容: 我只是想要一些有关此的信息。 什么是在的结尾文字呢?这叫什么?为什么使用它? 问题答案: 在表明它是一个浮点文字,不是双字面它并没有一个特定的技术名称,我知道(这将暗示以其它方式) -我倾向于把它称为“字母后缀”如果我需要参考具体来说,尽管有点武断! 例如: 您当然可以: …几乎可以完成同一件事,但是F是一种更简洁,更简洁的表示方式。 为什么选择double作为默认值而不是float?

  • 本文向大家介绍关于Ajax技术中servlet末尾的输出流,包括了关于Ajax技术中servlet末尾的输出流的使用技巧和注意事项,需要的朋友参考一下 Ajax的服务器端用PrintWriter out=resp.getWriter()来响应数据的时候,out.print(0)、out.print(1)来表示成功或失败,而不用out.write是有原因的,首先来看一下print和write两者的异

  • 问题内容: 我已经看过其中一些符号,但是找不到任何奇怪的符号, 5后的D和F分别是什么意思? 问题答案: 意味着这些数字分别是双精度数和浮点数。假设你有 然后你打电话 编译器可能被卡住了。这就是为什么你可以说,或指定类型。

  • 问题内容: 我在Python中有这个方便的功能: 它的作用类似于UNIX :文件的最后几行出现。这是方便,因为你可以得到发电机 无阻塞 ,并将它传递给另一个函数。 然后我必须在Go中执行相同的操作。我是该语言的新手,所以不确定我所做的操作是否足够习惯/正确。 这是代码: Go中有没有更干净的方法可以做到这一点?我觉得对这样的事情使用异步调用实在是太过分了,这确实让我感到困扰。 问题答案: 我建议围

  • tail 命令和 head 命令正好相反,它用来查看文件末尾的数据,其基本格式如下: [root@localhost ~]# tail [选项] 文件名 此命令常用的选项及含义如表 1 所示。 表 1 tail 命令选项及含义 选项 含义 -n K 这里的 K 指的是行数,该选项表示输出最后 K 行,在此基础上,如果使用 -n +K,则表示从文件的第 K 行开始输出。 -c K 这里的 K 指的是

  • 我不知道确切的原因,但是我的tableview的滚动条永远不会结束。 这是桌面视图的中间,一切看起来都很好 但当我走到尽头 滚动条没有到达终点... 我想我的约束是可以的(我使用的是autolayout),因为除了滚动条,tableview显示得很好。 我的视图控制器是一个,只包含一个。下面是一个屏幕截图,总结如下: 代码未添加任何约束。你知道我怎么调试这个吗? 提前谢谢 编辑:我试图删除和重新创