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" 的每次更新。
正在尝试 运行 具有 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" 的每次更新。