Docker ubuntu cron 尾日志不可见

Docker ubuntu cron tail logs not visible

正在尝试 运行 具有 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 returns 空结果

但是

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

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

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

这看起来很相似……

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

我尝试了您的设置,以下 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-撰写时的输出:

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

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

由于 docker 层和索引节点有些奇怪,您必须在 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

解释好像是这个:

在原来的post中,tail命令开始"listening"到图像层中的文件,然后cron将第一行写入该文件文件,docker 将文件复制到一个新层,即容器层(由于复制和写入文件系统的性质,docker 的工作方式)。因此,当文件在新层中创建时,它会获得一个不同的 inode,并且 tail 会继续监听之前的状态,因此会丢失对 "new file" 的每次更新。