在docker中使用crontab-ui


背景

首先说下,这个方法乍一看可能有点邪典,但我没找到更优雅的方法,欢迎有类似需求的同学留言交流下。

开搞之前,先说下我的需求

  • 首先我需要一个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点赞!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注