{"id":46185150,"url":"https://github.com/naomi233/watchducker","last_synced_at":"2026-03-02T22:38:34.576Z","repository":{"id":323464819,"uuid":"1093331813","full_name":"naomi233/watchducker","owner":"naomi233","description":"一个用 Go 语言编写的 Docker 容器镜像更新检查和自动更新工具","archived":false,"fork":false,"pushed_at":"2026-01-15T02:40:19.000Z","size":102,"stargazers_count":45,"open_issues_count":0,"forks_count":3,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-15T08:44:53.893Z","etag":null,"topics":["cicd","devops","docker","registry","update-checker","watchducker"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/naomi233.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-10T08:24:16.000Z","updated_at":"2026-01-15T02:38:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/naomi233/watchducker","commit_stats":null,"previous_names":["naomi233/watchducker"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/naomi233/watchducker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naomi233%2Fwatchducker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naomi233%2Fwatchducker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naomi233%2Fwatchducker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naomi233%2Fwatchducker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/naomi233","download_url":"https://codeload.github.com/naomi233/watchducker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/naomi233%2Fwatchducker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30022939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T22:30:10.381Z","status":"ssl_error","status_checked_at":"2026-03-02T22:23:34.650Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cicd","devops","docker","registry","update-checker","watchducker"],"created_at":"2026-03-02T22:38:33.845Z","updated_at":"2026-03-02T22:38:34.557Z","avatar_url":"https://github.com/naomi233.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WatchDucker 🐤🦆\n\n一个用 Go 语言编写的 Docker 容器镜像更新检查和自动更新工具。\n\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)\n\n## ✨ 特性\n\n- 🔍 **智能检查**: 自动检测容器使用的镜像是否有新版本可用\n- 🏷️ **标签驱动**: 通过 `watchducker.update=true` 标签自动管理需要更新的容器\n- ⏰ **定时执行**: 支持使用 cron 表达式进行定时检查\n- 🔄 **自动更新**: 检测到更新后可自动重启容器使用新镜像\n- 🚫 **灵活控制**: 提供只检查不重启的选项\n- ✨ **实时反馈**: 检查过程中提供实时进度和结果输出\n- 🐳 **Docker 原生**: 完全基于 Docker API，无需额外依赖\n- ⚙️ **无需代理**: 复用现有 Docker 配置，无需额外配置认证和代理、[加速镜像源](https://github.com/dongyubin/DockerHub)\n- 📢 **多平台通知**: 支持 Telegram、微信、钉钉、飞书、邮件等 15+ 种通知方式\n\n## 🚀 快速开始\n\n### 二进制安装\n\n从 [Releases 页面](https://github.com/naomi233/watchducker/releases) 下载对应平台的二进制文件：\n\n### Docker 镜像\n\n```bash\ndocker pull naomi233/watchducker:latest\n```\n\n### 源码编译\n\n```bash\ngit clone https://github.com/naomi233/watchducker.git\ncd watchducker\ngo build -o watchducker .\n```\n\n## 📖 使用方法\n\n### Docker\n\n```bash\n# 检查指定容器一次\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --once nginx redis mysql\n# 检查所有带有更新标签的容器一次\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --label --once\n# 检查所有容器一次，更新后清理悬空镜像\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --all --clean --once\n# 只更新镜像，不重启容器\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --no-restart --once nginx redis\n# 使用标签模式，同时防止自动重启\ndocker run --rm -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --label --no-restart --once\n# 每天凌晨2点检查所有标签容器\ndocker run --name watchducker -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --cron \"0 2 * * *\" --label\n# 每30分钟检查指定容器\ndocker run --name watchducker -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --cron \"*/30 * * * *\" nginx redis\n# 每天执行，只检查不重启\ndocker run --name watchducker -v /var/run/docker.sock:/var/run/docker.sock naomi233/watchducker:latest watchducker --cron \"@daily\" --no-restart nginx\n\n# 使用通知功能（方式一：挂载配置文件）\ndocker run --name watchducker -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd)/push.yaml:/app/push.yaml naomi233/watchducker:latest watchducker --cron \"0 2 * * *\" --label\n\n# 使用通知功能（方式二：环境变量，无需挂载配置文件）\ndocker run --name watchducker \\\n  -v /var/run/docker.sock:/var/run/docker.sock \\\n  -e WATCHDUCKER_SETTING_PUSH_SERVER=telegram \\\n  -e WATCHDUCKER_TELEGRAM_API_URL=api.telegram.org \\\n  -e WATCHDUCKER_TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN \\\n  -e WATCHDUCKER_TELEGRAM_CHAT_ID=YOUR_CHAT_ID \\\n  naomi233/watchducker:latest watchducker --cron \"0 2 * * *\" --label\n```\n\n### 可执行文件\n\n```bash\n# 检查指定容器一次\nwatchducker --once nginx redis mysql\n# 检查所有带有更新标签的容器一次\nwatchducker --label --once\n# 检查所有容器一次，更新后清理悬空镜像\nwatchducker --all --clean --once\n# 只更新镜像，不重启容器\nwatchducker --no-restart --once nginx redis\n# 使用标签模式，同时防止自动重启\nwatchducker --label --no-restart --once\n# 每天凌晨2点检查所有标签容器\nwatchducker --cron \"0 2 * * *\" --label\n# 每30分钟检查指定容器\nwatchducker --cron \"*/30 * * * *\" nginx redis\n# 每天执行，只检查不重启\nwatchducker --cron \"@daily\" --no-restart nginx\n# 使用 --label-reversed 参数检查所有容器，排除带有 watchducker.update=true 标签的容器\nwatchducker --label-reversed --once\n\n# 使用通知功能（需要配置 push.yaml）\nwatchducker --cron \"0 2 * * *\" --label\n```\n\n### Docker Compose 配置示例\n\n```yml\nservices:\n  watchducker:\n    image: naomi233/watchducker\n    container_name: watchducker\n    network_mode: bridge\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n      - ./push.yaml:/app/push.yaml  # 挂载通知配置文件\n    environment:\n      - TZ=Asia/Shanghai\n      - WATCHDUCKER_LOG_LEVEL=DEBUG\n      - WATCHDUCKER_CRON=0 2 * * *\n      - WATCHDUCKER_LABEL=true\n```\n\n## ⚙️ 配置选项\n\n### 命令行参数\n\n- `--all`: 检查所有容器（默认仅包含运行中的容器）\n- `--label`: 检查带有 `watchducker.update=true` 标签的容器\n- `--label-reversed`: 检查没有 `watchducker.update=true` 标签的容器\n- `--cron`: 定时执行，使用标准 [cron 表达式](https://crontab.guru) 格式，默认值 \"0 2 * * *\"\n- `--once`: 只执行一次检查和更新，然后退出\n- `--clean`: 更新容器后自动清理悬空镜像\n- `--no-restart`: 只更新镜像，不重启容器\n- `--include-stopped`: 在检查时包含已停止的容器\n- `--disabled-containers`: 排除指定的容器，不进行检查和更新（支持逗号分隔多个容器）\n- 容器名称列表\n\n### 通知功能配置\n\nWatchDucker 支持同时使用多种通知渠道，可通过 `push.yaml` 配置文件或环境变量进行配置。\n\n#### 方式一：配置文件（推荐）\n\n```yaml\nsetting:\n  push_server: \"telegram\"  # 推送服务列表（支持多渠道 用,分开）\n  log_level: \"DEBUG\"  # 日志级别：DEBUG/INFO/WARN/ERROR\n\ntelegram:\n  api_url: \"api.telegram.org\"  # Telegram API地址（支持反代）\n  bot_token: \"YOUR_BOT_TOKEN\"  # 机器人Token\n  chat_id: \"YOUR_CHAT_ID\"  # 聊天ID\n\n# 其他通知方式配置...\n```\n\n#### 方式二：环境变量（无需挂载配置文件）\n\n环境变量会覆盖配置文件中的对应值，格式为 `WATCHDUCKER_` + 配置路径（用下划线连接）：\n\n```bash\n# 基础配置\nexport WATCHDUCKER_SETTING_PUSH_SERVER=\"telegram,dingrobot\"\nexport WATCHDUCKER_SETTING_LOG_LEVEL=\"INFO\"\n\n# Telegram 配置\nexport WATCHDUCKER_TELEGRAM_API_URL=\"api.telegram.org\"\nexport WATCHDUCKER_TELEGRAM_BOT_TOKEN=\"YOUR_BOT_TOKEN\"\nexport WATCHDUCKER_TELEGRAM_CHAT_ID=\"YOUR_CHAT_ID\"\n\n# 钉钉配置\nexport WATCHDUCKER_DINGROBOT_WEBHOOK=\"https://oapi.dingtalk.com/robot/send?access_token=xxx\"\nexport WATCHDUCKER_DINGROBOT_SECRET=\"SECxxx\"\n```\n\nDocker Compose 环境变量示例：\n\n```yml\nservices:\n  watchducker:\n    image: naomi233/watchducker\n    container_name: watchducker\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n    environment:\n      - TZ=Asia/Shanghai\n      - WATCHDUCKER_CRON=0 2 * * *\n      - WATCHDUCKER_LABEL=true\n      # 通知配置（无需挂载 push.yaml）\n      - WATCHDUCKER_SETTING_PUSH_SERVER=telegram\n      - WATCHDUCKER_TELEGRAM_API_URL=api.telegram.org\n      - WATCHDUCKER_TELEGRAM_BOT_TOKEN=YOUR_BOT_TOKEN\n      - WATCHDUCKER_TELEGRAM_CHAT_ID=YOUR_CHAT_ID\n```\n\n支持的通知服务：\n- **Telegram**: 机器人推送\n- **Server酱 (FTQQ)**: 微信推送\n- **PushPlus**: 微信推送\n- **CQHTTP**: QQ 推送\n- **SMTP**: 邮件推送\n- **企业微信**: 应用消息和群机器人\n- **PushDeer**: 自建推送服务\n- **钉钉**: 群机器人\n- **飞书**: 群机器人\n- **Bark**: iOS 推送\n- **Gotify**: 自建推送服务\n- **IFTTT**: Webhook 触发\n- **Webhook**: 自定义 Webhook\n- **Qmsg**: QQ 消息推送\n- **Discord**: Webhook 推送\n\n详细配置示例请参考 [push.yaml.example](push.yaml.example) 文件。\n\n### 环境变量\n\n```bash\n# 设置容器时区（默认 UTC，可按需覆盖）\nexport TZ=Asia/Shanghai\n\n# 设置日志级别 (DEBUG/INFO/WARN/ERROR)\nexport WATCHDUCKER_LOG_LEVEL=DEBUG\n\n# 等同于 --all 选项\nexport WATCHDUCKER_ALL=true\n\n# 等同于 --label 选项\nexport WATCHDUCKER_LABEL=true\n\n# 等同于 --label-reversed 选项\nexport WATCHDUCKER_LABEL_REVERSED=true\n\n# 等同于 --cron 选项\nexport WATCHDUCKER_CRON=\"0 2 * * *\"\n\n# 等同于 --clean 选项\nexport WATCHDUCKER_CLEAN=true\n\n# 等同于 --no-restart 选项\nexport WATCHDUCKER_NO_RESTART=true\n\n# 等同于 --include-stopped 选项\nexport WATCHDUCKER_INCLUDE_STOPPED=true\n\n# 等同于 --disabled-containers 选项\nexport WATCHDUCKER_DISABLED_CONTAINERS=\"container1,container2\"\n```\n\n### 时区配置\n\n容器镜像默认按照 UTC 运行。只需通过标准 `TZ` 环境变量（如 `-e TZ=Asia/Shanghai`，或在 Compose/环境配置中设置 `TZ`）即可让容器启动时自动切换到目标时区，无需额外挂载 `/etc/localtime`。\n\n### 使用标签驱动更新\n\n为需要自动更新的容器添加标签：\n\n```bash\ndocker run --name nginx --label watchducker.update=true nginx:latest\n```\n\n## 🏗️ 项目架构\n\n### 目录结构\n\n```\nwatchducker/\n├── cmd/                    # 命令行入口\n│   └── cmd.go               # 主命令逻辑\n├── internal/                 # 内部模块\n│   ├── core/                # 核心业务逻辑\n│   │   ├── checker.go         # 镜像检查器\n│   │   └── operator.go      # 容器操作器\n│   ├── docker/               # Docker API 封装\n│   │   ├── client.go         # 客户端管理\n│   │   ├── container.go     # 容器服务\n│   │   └── image.go          # 镜像服务\n│   └── types/                 # 类型定义\n│       └── types.go\n├── pkg/                      # 可复用的公共包\n│   ├── config/                # 配置管理\n│   │   └── config.go\n│   ├── logger/               # 日志系统\n│   │   └── logger.go\n│   ├── notify/               # 通知系统\n│   │   └── notify.go         # 多平台通知服务\n│   └── utils/                 # 工具函数\n│       └── display.go         # 显示输出\n├── main.go                    # 程序入口\n├── push.yaml.example         # 通知配置示例文件\n```\n\n### 核心组件\n\n- **Checker**: 镜像检查器，负责检查容器使用的镜像是否有更新\n- **Operator**: 容器操作器，负责容器的重启和更新操作\n- **ContainerService**: 容器服务，封装 Docker 容器的操作\n- **ImageService**: 镜像服务，封装 Docker 镜像的检查逻辑\n- **NotifyService**: 通知服务，支持 15+ 种通知方式推送更新结果\n\n## 🔧 开发\n\n### 依赖要求\n\n- Go 1.25 或更高版本\n- Docker 守护进程（用于容器操作）\n- 网络连接（用于镜像仓库访问）\n\n### 项目构建\n\n```bash\n# 开发构建\ngo build -o watchducker .\n\n# 多平台发布（使用 GoReleaser）\ngoreleaser build --snapshot\n\n# 创建 Docker 镜像\ngoreleaser release --snapshot\n```\n\n## 📊 工作流程\n\n1. **容器发现**: 根据容器名称或标签查找相关容器\n2. **镜像检查**: 并发检查所有镜像是否有更新版本\n3. **自动更新**: 停止旧容器 → 删除旧容器 → 创建新容器 → 启动新容器\n\n## 🔐 安全性\n\n- 只对指定标签的容器进行操作\n- 提供清晰的日志记录所有操作\n- 支持只检查模式，避免意外重启\n\n## 🐛 故障排除\n\n### 常见问题\n\n1. **权限错误**: 确保程序有足够的权限访问 Docker 守护进程\n2. **网络连接**: 检查是否有网络连接访问镜像仓库\n3. **容器状态**: 确保目标容器处于运行状态\n\n### 调试模式\n\n```bash\n# 启用调试日志\nexport WATCHDUCKER_LOG_LEVEL=DEBUG\nwatchducker --label\n```\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n## 📄 许可证\n\n本项目采用 [GNU GPL v3](LICENSE) 许可证。\n\n## 🙏 致谢\n\n- [containrrr/watchtower](https://github.com/containrrr/watchtower/)\n\n---\n\n**WatchDucker** - 让 Docker 容器更新变得简单智能！\n\n\u003e ⚠️ **注意**: 在生产环境中使用前，请充分测试所有功能。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaomi233%2Fwatchducker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnaomi233%2Fwatchducker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnaomi233%2Fwatchducker/lists"}