将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则不会出现输出。但是,如果我登录到正在运行的容器并拖尾文件,则可以看到内容:
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”附加到文件中,这还会修改最后的更新时间戳,从而强制执行写时复制:
tail
docker exec
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