【发布时间】:2021-08-01 10:40:28
【问题描述】:
我正在尝试使用基于 Alpine 映像的 docker 容器来运行计划的 cron 作业,遵循此 tutorial,但在我的启动脚本中打印了该语句后,容器就退出了,而没有运行我的其他脚本。
我的docker-compose服务配置如下:
cron:
image: alpine:3.11
command: /usr/local/startup.sh && crond -f -l 8
volumes:
- ./cron_tasks_folder/1min:/etc/periodic/1min/:ro
- ./cron_tasks_folder/15min:/etc/periodic/15min/:ro
- ./cron_tasks_folder/hourly:/etc/periodic/hourly/:ro
- ./scripts/startup.sh:/usr/local/startup.sh:ro
所以它运行一个名为startup.sh 的初始脚本,然后启动 cron 守护进程。 startup.sh 脚本包含以下内容:
#!/bin/sh
echo "Starting startup.sh.."
echo "* * * * * run-parts /etc/periodic/1min" >> /etc/crontabs/root
crontab -l
sleep 300
我在那里放了一个 sleep 命令,这样我就可以在容器上启动一个交互式 shell 并确保它里面的所有东西看起来都很好。该脚本为 1 分钟脚本创建另一个文件夹。我在那里添加了一个测试脚本,我可以验证它在那里:
/etc/periodic/1min # ls -a
. .. testScript
脚本是可执行的:
/etc/periodic/1min # ls -l testScript
-rwxr-xr-x 1 root root 31 Jul 30 01:51 testScript
而testScript 只是一个回显语句,以确保它首先工作:
echo "The donkey is in charge"
查看 etc/crontabs 中的root 文件,我看到以下内容(我已经多次重新运行容器,每次它都创建一个新的 1min 文件夹,这是不必要的,但我认为不是这里的问题):
# do daily/weekly/monthly maintenance
# min hour day month weekday command
*/15 * * * * run-parts /etc/periodic/15min
0 * * * * run-parts /etc/periodic/hourly
0 2 * * * run-parts /etc/periodic/daily
0 3 * * 6 run-parts /etc/periodic/weekly
0 5 1 * * run-parts /etc/periodic/monthly
* * * * * run-parts /etc/periodic/1min
* * * * * run-parts /etc/periodic/1min
* * * * * run-parts /etc/periodic/1min
* * * * * run-parts /etc/periodic/1min
* * * * * run-parts /etc/periodic/1min
testScript 中的 echo 语句从未打印到我的终端,并且容器在启动后不久以退出代码 0 退出。我想每分钟打印一次这个声明......我错过了什么?
【问题讨论】:
-
您认为您在哪里启动 cron 调度程序?
crontab -l列出 cron 作业,但它不会启动调度程序。根据您提供的数据,我会说您实际上并没有启动 cron。 -
@DanielFarrell 我的理解是 docker-compose 的
command中的&& crond -f -l 8正在这样做。 -
好吧,没错,我错过了。但是
startup.sh必须在运行command的shell 执行crond 之前退出。你在等那5分钟吗?如果我是你,我会用exec crond -f -l 8代替startup.sh中的sleep。如果这不起作用,请确保您正在检查 docker 日志。 -
行得通!我现在收到以下错误,但这是一个不同的问题:
run-parts: can't execute '/etc/periodic/1min/testScript': Exec format error。话虽如此,我也可以从我的 docker-compose 命令中删除&& crond -f -l 8。这种配置是可接受的做法吗?如果你想回复这个答案,我会接受。谢谢。 -
我会提供一个真实的答案。您能否在您的 dockerfile 中提供
ENTRYPOINT(如果有)?
标签: linux docker docker-compose cron