banner
约 1,200 字
4 分钟

Docker 镜像有新版,手机收到提醒,点一下就自动更新

摘要

Autodocker 开源了,也补上了 Docker 安装方式:群晖、威联通、树莓派、软路由、云主机,只要能跑 Docker 就能装。定时巡检本机容器的镜像,发现新版就往飞书推一张卡片,手机上点一下「立即更新」,它自己拉镜像、按原配置重建容器,失败了自动回滚。这篇讲怎么用 compose 或一条 docker run 装起来,以及收到提醒之后会发生什么。

前言

上一篇发的是 Autodocker 的飞牛安装版。这次把项目开源到了 GitHub,也补上了 Docker 安装方式:不用飞牛系统,群晖、威联通、树莓派、软路由、云主机,只要能跑 Docker 就能装。

装好之后就是标题里那件事:容器镜像有新版,手机会收到一条提醒,点一下「立即更新」,它自己把新镜像拉下来、按原配置重建容器,失败了还能自动回滚。功能和飞牛版完全一致。

项目地址:https://github.com/haihaipypy/autodocker

Autodocker 的 GitHub 仓库

两个版本的差别

飞牛应用包

Docker 镜像版

怎么装

应用中心手动安装 .fpk

docker compose 或 docker run

默认端口

19999

17777

适合

飞牛 fnOS

群晖、威联通、树莓派、软路由、云主机、任意 Linux

升级

下载新包覆盖安装

docker compose pull

功能

完全一致

完全一致

镜像同时提供 linux/amd64 与 linux/arm64,x86 的 NAS 和 ARM 的树莓派都能用。发布在 Docker Hub 和 GHCR 两个仓库,一个拉不动就换另一个。

同一台机器只装一个版本。 两个版本都会连宿主机的 Docker,同时开会重复巡检、重复发通知。

方式一:docker compose(推荐)

先在任意目录建一个文件夹,新建一个 docker-compose.yml

YAML
services:
  autodocker:
    container_name: autodocker
    image: haihaipypy/autodocker:latest
    restart: unless-stopped
    ports:
      - "17777:17777"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/data
    environment:
      - TZ=Asia/Shanghai
      - PORT=17777
      - SELF_CONTAINER=autodocker

启动项目

纯文本
docker compose up -d

docker compose 启动后容器处于运行中

项目启动后,浏览器打开:

纯文本
http://<机器的IP>:17777

打开就是界面,不用注册、不用登录(默认没设密码)。

yaml 文件里需要你留意的只有三处,其余都是可选的注释项:

配置

为什么必须有

/var/run/docker.sock

靠它看到宿主机的容器、拉镜像、重建容器。少了它,容器列表是空的

./data:/data

存设置和更新记录。不挂的话容器重建后配置会丢

17777:17777

网页端口。左边是宿主机端口,右边是容器内端口,只能改左边

SELF_CONTAINER=autodocker 是告诉程序「你自己叫这个名字」,它会拒绝更新自己。如果你把 container_name 改成了别的,这一行要跟着改。

Docker Hub 拉不动就换 GHCR,或其他镜像源地址,内容完全一样:

Shell
docker pull ghcr.io/haihaipypy/autodocker:latest

方式二:docker run

不想建文件,一条命令也行:

Shell
docker run -d --name autodocker --restart unless-stopped \
  -p 17777:17777 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$PWD/data:/data" \
  -e TZ=Asia/Shanghai \
  -e SELF_CONTAINER=autodocker \
  haihaipypy/autodocker:latest

要密码就加一行 -e ADMIN_PASSWORD='你的密码'。

使用

1. 容器列表

首次启动会自动扫描一次,把本机所有带 tag 的镜像都纳入监控。打开网页就能看到在跑的容器、当前版本、有没有可用的新版。

Autodocker 容器列表

2. 配好飞书

进网页「设置」标签页,填三项:App ID、App Secret、chat_id。

设置页内置的飞书配置指引

设置页里内置了一份 8 步配置指引,展开照着做就行,建应用、开权限、配回调、发布版本、拉机器人进群都在里面。填完点「发送飞书测试卡片」,能在群里收到卡片、点一下变成「回调已收到」,就说明链路通了。想看得更细,上一篇有逐图说明。

3. 决定要不要设密码

默认不启用登录,打开网页就能用。端口只在内网的话这样最省事;要让它离开内网,就去设置里配上访问密码。原因见下面的注意事项。

收到提醒之后

巡检发现新版本,飞书群里会收到这样一张卡片,容器、镜像、当前版本、可用版本都列在上面:

飞书收到的镜像更新提醒

点「立即更新」,卡片原地变成进度,不用回网页、不用登服务器:

点击后卡片变成正在更新容器

镜像拉完、容器重建完成,结果直接回到这张卡片上:

更新完成

三个按钮的分工:

按钮

做什么

立即更新

拉新镜像,按原配置重建容器,卡片原地变成进度和结果

稍后提醒

这一轮不动,下次巡检还会提醒

忽略本版本

这个容器不再提醒,在网页里可以恢复

重建用的是原来那份配置,挂载目录、端口映射、网络、环境变量一样都不会丢。新容器起来后有一段观察窗口,健康检查没过就自动回滚,把旧容器重新拉起来。

升级

Shell
cd ~/autodocker
docker compose pull && docker compose up -d

配置和数据都在 ./data 里,升级不动它们。

镜像标签有四种,按需要选:

标签

含义

latest

最近一次正式版本,默认用这个

1.2.3 / 1.2

锁死某个版本,不跟着往前跑

main

主干最新构建,可能夹带没做完的改动

sha-1a2b3c4

对应某次提交,排查问题时用

latest 只在发正式版本时移动,主干上的半成品不会跑到你机器上。

注意事项与常见问题

情况

说明

怎么处理

挂了 docker.sock

程序因此拿到宿主机 root 权限,谁能打开这个网页,谁就能操作你所有的容器

只在内网用。要让端口离开内网,去设置里配上访问密码

程序不会更新自己

靠容器名和容器内的 hostname 双重判断,更新自己会导致进程被杀、任务断在半路

不用管,这是有意设计的

网页打不开

端口没映射对,或者宿主机防火墙没放行

docker ps 的 PORTS 列应该是 0.0.0.0:17777->17777/tcp

换了端口后打不开

ports 和 PORT 没改一致

只换对外端口就改左边,"18000:17777";连程序端口一起换,就是 "18000:18000" 加 PORT=18000

列表里全是「未知」

检测是程序自己向镜像仓库发请求,不走 Docker 守护进程的加速配置

进设置填加速地址(比如 docker.1ms.run),点「检测注册表连通性」看每个源的耗时

拉镜像一直超时

Docker Hub 在国内时快时慢,匿名拉取还按 IP 限流

把 image 换成 ghcr.io/haihaipypy/autodocker:latest,或者给 Docker 配上加速

更新完多出一个 xxx-old-时间戳

这是回滚用的现场备份

成功后会自动删掉;确认新容器没问题后可以 docker rm 掉

想备份配置

设置和更新记录都在 SQLite 里

拷走 ./data/autodocker.db 就行

卸载:

Shell
cd ~/autodocker
docker compose down

数据都在 ./data 目录里,不要了连目录一起删。

结尾

通知目前只走飞书,因为我自己用得最多,卡片上的按钮也顺手。后续会加钉钉、Telegram、企业微信这些渠道,用哪个填哪个。

有问题评论区说一声。

END