Docker镜像更新通知器DIUN

什么是 DIUN ?

Docker Image Update Notifier 是一个用 Go 编写的 CLI 应用程序,可作为单个可执行文件和 Docker 映像交付,用于当 Docker 映像在 Docker registry中更新时接收通知。

和老苏之前介绍过的 watchtower 不同,DIUN 只是通知,并不会像 watchtower 一样自动更新镜像和容器

文章传送门:watchtower自动化更新docker镜像

准备

原本老苏打算一如既往使用 88邮件来发送消息,但是要么是 554 sender is rejected 错误

1
diun    | Wed, 24 May 2023 17:17:56 CST ERR Mail notification failed error="gomail: could not send email 1: 554 sender is rejected: 0" image=docker.io/crazymax/diun:latest

要么是 error=EOF 错误,懒得再换邮箱折腾了

1
diun    | Wed, 24 May 2023 19:14:06 CST ERR Mail notification failed error=EOF image=docker.io/crazymax/diun:latest

DIUN 还支持不少消息类型,老苏最后选择了用 Gotify

获取 Gotify Token

如果你还不了解、没安装过 Gotify,可以点下面的传送门

文章传送门:Gotify消息推送系统搭建

安装完成后,新建一个应用,获取到Token,我们后面推送消息要用到

配置文件 diun.yml

Diun 中有两种不同的方式来定义配置

  • 使用环境变量
  • 使用配置文件

老苏采用了配置文件方式,具体的参数可以看官方的说明:https://crazymax.dev/diun/config/

这里我们使用最小配置每 6 小时分析一次本地 Docker 实例的所有正在运行的容器,并使用了 gotify 发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
db:
path: diun.db

watch:
workers: 10
schedule: "0 */6 * * *"
firstCheckNotif: true

notif:
gotify:
endpoint: http://192.168.0.197:8385
token: <你的 Gotify Token >
priority: 1
timeout: 10s
templateTitle: "{{ .Entry.Image }} released"
templateBody: |
Docker tag {{ .Entry.Image }} which you subscribed to through {{ .Entry.Provider }} provider has been released.

providers:
docker:
watchStopped: true
watchByDefault: true

上面有两处要修改

  • endpoint:要换成你自己的gotify 的访问地址 ;
  • token:也要换成你上一步从 gotify 获取的 Token

安装

与容器相关的应用,都需要绑定挂载 /var/run/docker.sock ,包括我们之前安装的 portainerwatchtowerGlancesNetdatalazydocker 等。

什么是 /var/run/docker.sock ?

/var/run/docker.sockDocker API 的主要入口,简单地说,它是 Docker 守护进程(Docker daemon)默认监听的 Unix 域套接字(Unix domain socket),容器中的进程可以通过它与 Docker 守护进程进行通信。

title

图片来自:https://betterprogramming.pub/about-var-run-docker-sock-3bfd276e12fd

但是群晖的 Docker 管理器并不支持挂载 /var/run/docker.sock 文件,所以这次我们需用命令行来安装

docker cli 安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 新建文件夹 diun 和 子目录
mkdir -p /volume2/docker/diun/data

# 进入 diun 目录
cd /volume2/docker/diun

# 将 diun.yml 放入当前目录

# 运行容器
docker run -d \
--restart always \
--name diun \
-v $(pwd)/data:/data \
-v $(pwd)/diun.yml:/diun.yml:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
-e "TZ=Asia/Shanghai" \
-e "LOG_LEVEL=info" \
-e "LOG_JSON=false" \
crazymax/diun:latest \
serve

docker-compose 安装

将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: "3.5"

services:
diun:
image: crazymax/diun:latest
container_name: diun
restart: always
volumes:
- "./data:/data"
- "./diun.yml:/diun.yml:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
environment:
- "TZ=Asia/Shanghai"
- "LOG_LEVEL=info"
- "LOG_JSON=false"
command: serve

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 diun 和 子目录
mkdir -p /volume2/docker/diun/data

# 进入 diun 目录
cd /volume2/docker/diun

# 将 diun.yml 和 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:8385 ,查看 Gotify消息,当检测到容器有新版本时,会收到信息

参考文档

crazy-max/diun: Receive notifications when an image is updated on a Docker registry
地址:https://github.com/crazy-max/diun/

Diun 文档
地址:https://crazymax.dev/diun/

alerting system for the publishing of new docker images with DIUN: how have you configurated it for emails message? Have you some examples to optimize mine? I have got a couple of questions… : selfhosted
地址:https://www.reddit.com/r/selfhosted/comments/qbunu2/alerting_system_for_the_publishing_of_new_docker/