[i=s] 本帖最后由 jamyer 于 2024-12-23 20:59 编辑 [/i]<br />
<br />
前言
最近刚入门docker,对此产生了一定的兴趣,也产生了不少的困难和问题。
在部署alist-xiaoya和clash的时候,需要使用到crontab来实现docker的定时重启。
但是不清楚是否是我这边的问题,无论是普通用户还是root用户下,我的crontab定时服务都不能正常运作,而且我也看了论坛中某些大佬也表示root下的crontab配置似乎会随着重启而重置。
因此在网上搜寻了良久,找到了一个平替的方法:用service和timer来代替crontab的服务。
以下是具体操作过程:
实践场景1:alist-xioaya每日自动更新/重建
我用的docker版本alist-xiaoya是按照这篇教程部署的:alist-xiaoya部署教程
其中的自动更新选项:
AUTO_UPDATE_ENABLED: "true" # 是否启用自动更新小雅 alist 的功能,"true" 启用,"false" 禁用
该功能在本人的nas中会出错,而且更新一次出错一次,似乎是会导致读取不到原有的token和cookies,对此我实践了一下,发现这个功能其实就是docker restart xiaoya-alist-1,使用该docker-compose部署的话,直接restart xiaoya-alist-1容器就会导致读取不到原有的token和cookies。
因此我尝试了一下,直接ssh到飞牛 然后使用docker-compose down 和docker-compose up 会如何呢 然后发现docker并不在环境变量里 因此提示找不到command
这个简单,临时添加一下就好:
export PATH=$PATH:/usr/libexec/docker/cli-plugins
当然临时添加的话重新ssh一次就会消失,想要常驻的话要把它保存到~/.bashrc中,然后又发现重新ssh进去 echo $PATH
,里面还是没有环境变量。
最后检查一下 才发现无论是~/.bashrc还是~/.profile,在fnos系统里面一开始都是没有的,没有~/.profile对~/.bashrc的显式调用的话,那么~/.bashrc不会被自动读取。
所以只能死马当活马医,尝试在~/.profile中设置环境变量,然后再抱着忐忑的心情再次ssh,继续 echo $PATH
,最后终于成功了。

(其实正确操作应该是在~/.profile中加入以下代码来显式调用~/.bashrc。这个主要看个人习惯,因为飞牛os似乎也只能ssh进去?配置服务的时候也还是要另外设置环境变量的,但是或许符合规范会比较好一点)
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
因此:
第一步环境变量配置具体的操作过程就是:
ssh -p 22 username@ip #ssh连接到飞牛
cd ~/ #到.bashrc和.profile的所在目录 当然目前是没有的
sudo nano .profile
#在里面输入:export PATH=$PATH:/usr/libexec/docker/cli-plugins
#然后ctrl+X退出 Y保存 回车键确认文件名不用修改
#然后退出重新ssh进来
echo $PATH #如果出现/user/libexec/docker/cli-plugins 那么应该就成功了
docker -v #为了验证docker是否能正常使用 出现Docker version xx.x.x即为成功
第二步开始编写重启xiaoya_rebuild的脚本:
#!/bin/bash
cd /vol1/1000/docker/xiaoya
docker-compose down
sleep 10 #这个其实不用的 但是上面的 #!/bin/bash 千万不能删 不然无法在服务中运行该脚本
docker-compose up -d --build
将脚本保存到/vol1/1000/docker/xiaoya中 命名为xiaoya_rebuild.sh
第三步开始编写服务:
cd /etc/systemd/system #进入服务和计时器文件所在目录
sudo nano xiaoya_rebuild.service #编写服务
[Unit]
Description=Xiaoya Rebuild Script
[Service]
Environment=PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/libexec/docker/cli-plugins"
ExecStart=/vol1/1000/docker/xiaoya/xiaoya_rebuild.sh
WorkingDirectory=/vol1/1000/docker/xiaoya
User=username
完成后ctrl+x保存,y确定,回车确认即可。
其中ExecStart和WorkingDirectory根据自己脚本所在位置调整
User=自己用户的username
Environment还是要配置,虽然更改了~/.profile使得所有用户连接到飞牛的时候都自动配置环境变量,但是该配置在服务中似乎不能继承
之后尝试运行服务来重建xiaoya,结果还是报错了,错误原因大概是当前用户无法使用docker-compose的命令。这就需要将当前用户加入docker组,命令如下:
usermod -aG docker username
这个命令中的username不需要改成自己的username,默认会将当前用户加入到docker组中,为了避免用户混淆,所以运行命令都是使用sudo,而不是直接sudo -i切换成root用户执行。
groups
使用该命令来检测当前用户所属的用户组来确认是否成功加入了用户组
若结果如下则成功:

由上图可看出用户已在docker组中
接下来再次尝试启动服务:
sudo systemctl start xiaoya_rebuild.service #启动服务
sudo systemctl status xioaya_rebuild.service #检查服务状态
服务启动后会默认运行一次docker-compose的重建,完成后会进入active(waiting)状态
因为每次重启xiaoya所需的时间太久,所以这里就不再演示。
最后第四步就是定时器的编写:
sudo nano xiaoya_rebuild.timer
内容如下:
[Unit]
Description=Run Xiaoya Rebuild Script daily at 8:00 AM
[Timer]
OnCalendar=*-*-* 08:00:00
Unit=xiaoya_rebuild.service
[Install]
WantedBy=timers.target
主要需要修改的就是08:00:00,可以修改成你需要的任何时间。
如果需要没两天重启一次的话,则是将OnCalendar命令修改为:
OnCalendar=*-*-*/2 08:00:00
三天就是/3,以此类推。
若是需要一天rebuild两次,如早上八点和晚上八点,则多加一个OnCalendar即可:
[Timer]
OnCalendar=*-*-* 08:00:00
OnCalendar=*-*-* 20:00:00
Unit=xiaoya_rebuild.service
然后根据自己的实际修改来修改Description即可。
退出保存xiaoya_rebuild.timer
随后输入以下命令:
sudo systemctl enable xiaoya_rebuild.timer #将定时器配置为在系统启动时自动启动
sudo systemctl start xiaoya_rebuild.timer #开启定时器
sudo systemctl status xiaoya_rebuild.timer #查看定时器状态
出现当下输出即为成功:

接下来可以使用该命令来查看当前所有正在使用的计时器:
systemctl list-timers --all

若从中看到xiaoya_rebuild.timer即可。
实践场景2:小猫咪每日自动更新订阅
这部分还是crontab的锅。。。。。。
经过第一个实践场景的详细说明,第二个实践场景我就简单点,主要讲具体操作了。
第一步编写clash_update.sh:
#!/bin/bash
cd /vol1/1000/docker/clash
wget -O /vol1/1000/docker/clash/config.yaml "https:xxxxxxxxxx" #/vol1/1000/docker/clash/config.yaml是你当前配置文件 https:xxxxxxxxxx输入kun场地址
if [ $? -eq 0 ]; then
#更新配置文件
sed -i 's/allow-lan: false/allow-lan: true/g' /vol1/1000/docker/clash/config.yaml
echo "配置文件下载并更新成功。"
#判断是否存在名为 'clash' 的容器
if [ $(docker ps -q -f name=clash) ]; then
# 停止容器
echo "Stopping clash container..."
docker stop clash
# 启动容器
echo "Starting clash container..."
docker start clash
echo "Clash Docker container restarted successfully."
else
echo "Clash container not found."
fi
else
echo "下载配置文件失败。"
fi
还是同样要注意的点,开头的#!/bin/bash不能删,这个属于是Shebang,用于指定脚本在执行时应该使用的解释器。删除的话会导致服务运行报错。
将clash_update.sh保存到与config.yaml相同的目录中即可
第二步编写服务:
cd /etc/systemd/system
sudo nano clash_update.service
clash_update.service中内容:
Description=Clash Update Script
[Service]
Environment=PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
ExecStart=/path/to/your/script/clash_update.sh
WorkingDirectory=/path/to/your/script/
User=your_user_name
尝试启用一次服务看是否有错误:
sudo systemctl start clash_update.service
sudo systemctl status clash_update.service
说个题外话,也不知道能不能说这些,不能说的话佬们提醒我删一下,小猫咪目前似乎是不支持歇斯底里2协议的,但是很多kun场的订阅链接会包含歇斯底里2协议的节点,这就可以自己本地部署个转换的小工具,或者直接point,排除掉歇斯底里2再生成短链即可。
第三步编写计时器:
sudo nano clash_update.timer
clash_update.timer内容:
[Unit]
Description=Run Clash Update Script daily at 8:00 AM
[Timer]
OnCalendar=*-*-* 08:00:00
Unit=clash_update.service
[Install]
WantedBy=timers.target
然后启动计时器自启并尝试启动计时器,检查计时器状态:
sudo systemctl enable clash_update.timer
sudo systemctl start clash_update.timer
sudo systemctl status clash_update.timer
sudo systemctl list-timers --all
至此第二个使用场景分享结束。
至此分享结束,由于这些思路也是从网上搜索总结出来的,且第一次分享方法,所以诸多纰漏,因此有问题欢迎沟通,望大佬们不吝赐教。