Contents
背景
首先说下,这个方法乍一看可能有点邪典,但我没找到更优雅的方法,欢迎有类似需求的同学留言交流下。
开搞之前,先说下我的需求
- 首先我需要一个crontab功能,并且希望有UI——人懒且菜,能UI就不shell
- 出于安全/方便迁移等考虑,安装方式需要有docker——安装各种奇奇怪怪的依赖太头大了,外加被docker惯坏了,能docker就不apt
- OK,最后来看看需要crontab的有哪些功能
- 跑nextcloud(运行在docker里)的定时任务
- 扫描photoprism(运行在docker里)的扫描任务
- 定时telnet vps,有必要的话ssh上去执行个脚本
- 定期清理下日志(docker应用的日志,一般mount到了宿主机)
在上一台unraid还是主力机的时候,我用的是unraid里的user scripts插件。界面简洁明了,功能也非常稳健,完美满足了我的需求。
可惜迁移freenas以后,我的大部分服务都跑在ubuntu上,离开了unraid,只好再找别的方案了。
方案
翻了翻网上的crontab ui项目,star多且更新勤的大约是这个。——alseambusher/crontab-ui
但是这是个node.js项目,作为docker控的我,当然会折腾docker方案了。
那么问题就来了,怎么在docker里面实现上面的需求?
nextcloud定时任务——这个好办,curl也能搞定
photoprism——这个就不太好搞了,需要docker exec,咋搞,把docker.sock给mount进来?
telnet vps——这个还行,apt install telnet即可
清理日志——mount下要清理的目录?
上面列了下需求发现,通过逐项添加依赖的方法在docker里执行是不现实的——操作繁琐,且随着脚本数量的增加,docker里的依赖会越来越多。那咋搞?别急,我们还有个曲线救国的方法。
——crontab-ui在docker里安装,且只充当ssh client的角色。定时任务开启ssh连接到宿主机,在宿主机里完成具体的任务。
下面来看看具体的步骤
步骤
创建crontab-ui的docker容器
#一定要创建这么个文件夹,否则job的日志会无法正常显示
mkdir -p crontabs/logs
docker run --name='crontab-ui' --mount type=bind,source="$(pwd)"/crontabs/,target=/crontab-ui/crontabs/ -d -p 8000:8000 alseambusher/crontab-ui
安装ssh&配置key
docker exec -it crontab-ui /bin/sh
apk add openssh
ssh-keygen -t rsa -C
cat id_rsa.pub
配置pubkey
# 宿主机上
cd .ssh
vi authorized_keys
# 把刚才的id_rsa.pub粘贴过来
添加任务&测试
如果配置成功,我们访问ip:8000就能看到crontab-ui的界面了
随便找个shell测试下,格式为ssh $user@$ip “$shell”。
这里我们试一下docker ps
计划通!
设置完成,别忘了选Save To Crontab!
搞定,收工!
常见的坑
坑1:日志不显示怎么办?
检查下上面,mount的目录里有没有logs这个文件夹,如果没有,需要手动创建!
坑2:保存完不生效?
记得选Save To Crontab!已经保存生效的任务,任务名旁边你会有个标志。
坑3:定时任务正常执行,日志不能正常显示?
一般是日志太大了,清理下logs文件夹试试。
——此处是内容的分割线——
除非注明,否则均为广陌原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.utopiafar.com/2022/03/12/use_crontab_ui_inside_docker/
码字不易,如果觉得内容有帮助,欢迎留言or点赞!