问题描述
在运行docker-compose up后运行docker-compose logs -f cron
时,我无法看到cron作业的任何输出。
当我使用VSCode附加到容器时,我导航到var/logs/cron.log
并运行cat
命令,没有看到任何输出。奇怪的是,当我运行crontab -l
时,我看到* * * * * /bin/sh get_date.sh
作为输出。
尝试解决方案说明
下面是我如何组织这个项目的(由于稍后的可扩展性原因,目前它被过度工程化了)
├── config
│ └── crontab
├── docker-compose.yml
├── Dockerfile
├── README.md
└── scripts
└── get_date.sh
字符串
这里是关于上面的细节,内容很简单。此外,我尝试使用一个精简的python:3.8-slim-buster
docker镜像,这样我就可以运行bash或python脚本(没有尝试):
crontab
* * * * * /bin/sh get_date.sh
型
get_date.sh
#!/bin/sh
echo "Current date and time is " "$(date +%D-%H:%M)"
型
docker-compose.yml
version: '3.8'
services:
cron:
build:
context: .
dockerfile: ./Dockerfile
型
Dockerfile
FROM python:3.8-slim-buster
#Install cron
RUN apt-get update \
&& apt-get install -y cron
# Copying script file into the container.
COPY scripts/get_date.sh .
# Giving executable permission to the script file.
RUN chmod +x get_date.sh
# Adding crontab to the appropriate location
ADD config/crontab /etc/cron.d/my-cron-file
# Giving executable permission to crontab file
RUN chmod 0644 /etc/cron.d/my-cron-file
# Running crontab
RUN crontab /etc/cron.d/my-cron-file
# Create the log file to be able to run tail
RUN touch /var/log/cron.log
# Creating entry point for cron
CMD ["cron", "tail", "-f", "/var/log/cron.log"]
型
尝试的内容
我刚开始尝试让cron在容器环境中工作。我没有得到任何错误消息,所以不知道我如何可以调试这个问题,除了描述的行为。
我已经将crontab的内容从* * * * * root bash get_date.sh
更改为上面的内容。我还检查了stackoverflow,发现了一个类似的问题here,但据我所知,没有明确的解决方案。
先谢谢你了。
参考文献
2条答案
按热度按时间z9ju0rcb1#
有几个问题阻碍了此功能的正常工作:
1.您尝试运行
tail
是无效操作:在CMD
中,您只需运行cron tail -f /var/log/cron.log
命令即可。换句话说,您正在运行cron
并提供tail -f /var/log/cron.log
作为参数。如果你想运行cron
,然后运行tail
命令,你需要这样写:字符串
1.虽然上面的命令将启动cron并运行
tail
命令,但您仍然不会看到任何日志输出......因为Debiancron
不记录到文件;它记录到syslog
。在/var/log/cron.log
中看不到任何输出,除非安装、配置并运行syslog守护进程。我建议这是一个替代方案:
1.修复
config/crontab
中的语法;对于安装在/etc/cron.d
中的文件,您需要提供用户名:型
我在这里也明确了路径,而不是假设我们的cron作业和
COPY
命令具有相同的工作目录。这里还有一个问题:这个脚本输出到 stdout,但这不会有任何用处(cron通常从cron作业中获取输出,然后将其通过电子邮件发送给root)。我们可以显式地将输出发送到
syslog
:型
1.我们不需要使
get_date.sh
可执行,因为我们使用sh
命令显式地运行它。1.我们将使用busybox作为一个系统日志守护进程,它会记录到 stdout。
这一切让我们:
型
如果我们以此构建一个镜像,启动一个容器,并让它运行一段时间,我们会看到输出:
型
xa9qqrwz2#
我最近不得不将cron添加到debian 11 docker中。我不确定我的方法是否正确,但我的docker文件将所有crontab复制到/etc/cron.d中(您需要指定用户)。然后我在启动脚本中包含了/etc/init.d/cron start。虽然我不确定这是“正确”的方式来做到这一点,但它似乎工作。
Docker文件:
字符串
启动文件(run.sh):
型