Docker ubuntu cron尾日志不可见

时间:2018-07-18 10:11:27

标签: docker logging cron docker-compose tty

尝试运行具有cron调度的docker容器。但是我无法使其输出日志。

我正在使用docker-compose。

docker-compose.yml

---
version: '3'
services:
  cron:
    build:
      context: cron/
    container_name: ubuntu-cron

cron / Dockerfile

FROM ubuntu:18.10

RUN apt-get update
RUN apt-get update && apt-get install -y cron 

ADD hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Run the command on container startup
CMD cron && tail -F /var/log/cron.log

cron / hello-cron

* * * * * root echo "Hello world" >> /var/log/cron.log 2>&1

上面的命令在容器内的输出日志运行良好,但是它们没有流到docker。

例如 docker logs -f ubuntu-cron返回空结果

但是

如果您登录到容器docker exec -it -i ubuntu-cron /bin/bash,则会有日志。

cat /var/log/cron.log 
Hello world
Hello world
Hello world

现在我想也许我不需要登录到文件了吗?可以将其附加到sttoud,但不确定如何执行此操作。

这看起来很相似... How to redirect cron job output to stdout

3 个答案:

答案 0 :(得分:2)

我尝试了您的设置,以下Dockerfile起作用了:

FROM ubuntu:18.10

RUN apt-get update
RUN apt-get update && apt-get install -y cron

ADD hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0755 /etc/cron.d/hello-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log

# Symlink the cron to stdout
RUN ln -sf /dev/stdout /var/log/cron.log

# Run the command on container startup
CMD cron && tail -F /var/log/cron.log 2>&1

还请注意,我使用“ docker-compose up”而不是docker来启动容器。在这个特定示例中,这无关紧要,但是,如果您的实际解决方案更大,则可能很重要。

编辑:这是我运行docker-compose up时的输出:

neekoy@synchronoss:~$ sudo docker-compose up
Starting ubuntu-cron ... done
Attaching to ubuntu-cron
ubuntu-cron | Hello world
ubuntu-cron | Hello world
ubuntu-cron | Hello world

日志中的内容明显相同:

neekoy@synchronoss:~$ sudo docker logs daf0ff73a640
Hello world
Hello world
Hello world
Hello world
Hello world

我的理解是以上就是目标。

答案 1 :(得分:2)

由于docker层和inode中有些怪异,您必须在CMD期间创建文件:

CMD cron && touch /var/log/cron.log && tail -F /var/log/cron.log

这对文件和标准输出都有效:

FROM ubuntu:18.10

RUN apt-get update
RUN apt-get update && apt-get install -y cron

ADD hello-cron /etc/cron.d/hello-cron

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/hello-cron

# Create the log file to be able to run tail
# Run the command on container startup
CMD cron && touch /var/log/cron.log && tail -F /var/log/cron.log

解释似乎是这样的:

在原始帖子tail中,命令开始“侦听”位于图像层中的文件,然后当cron将第一行写入该文件时,docker将文件复制到新层,即容器层(由于复制和写入文件系统的性质,即docker的工作方式)。因此,在新层中创建文件时,它会获得一个不同的inode,并且tail会继续以以前的状态进行监听,因此会失去对“新文件”的每次更新。 Credits BMitch

答案 2 :(得分:0)

尝试在此> /dev/stdout上重定向,此后您应该会看到带有docker日志的日志。