文章目錄
- 前言
- 一、驗證 Watchtower 是否正在運行
- 1. 檢查 Watchtower 容器狀態
- 2. 查看 Watchtower 日志
- 二、檢查5分鐘間隔設置是否正確
- 1. 確認啟動命令
- 2. 驗證環境變量
- 三、排查更新未生效的原因
- 1. 檢查是否有鏡像更新
- 2. 檢查容器標簽
- 3. 檢查監控范圍
- 四、測試 Watchtower 功能
- 1. 手動觸發檢查🎯
- 2. 創建測試容器
- 五、常見問題解決方案
- 1. 時間間隔不生效
- 2. Watchtower 完全不工作
- 六、推薦的生產環境監控方案
- 七、分析日志
- 1. 阿里云私有倉庫認證失敗(主要問題)
- 2. 解決方案
- 3. 問題解決
前言
寫這篇文章主要記錄一次實際生產環境遇到的問題。起因是公司有兩個鏡像庫,一個是無需認證的公共鏡像庫,一個是需要賬號密碼認證的私有鏡像庫。都通過docker
+ watchtower
實現自動容器更新,但是私有庫死活不生效。下面記錄了排查過程。我這里是用了 5分鐘
的定時檢查。
雖然下文有很多方法都不是解決本次事故的原因,但是如果你不是站在 上帝視角
你又怎么能知道到底是因為什么原因引起的呢?所以我把排查方法都羅列出來了。
一、驗證 Watchtower 是否正在運行
1. 檢查 Watchtower 容器狀態
docker ps -f name=watchtower
正常應該看到類似輸出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 containrrr/watchtower:latest "/watchtower" 2 days ago Up 2 days watchtower
如果 STATUS
不是 "Up"
,說明容器沒有正常運行。
2. 查看 Watchtower 日志
docker logs watchtower
正常運行的 Watchtower 會有類似這樣的周期性日志:
time="2023-05-01T12:00:00Z" level=info msg="Checking for new images"
time="2023-05-01T12:00:01Z" level=info msg="No new images found for nginx"
二、檢查5分鐘間隔設置是否正確
1. 確認啟動命令
你的啟動命令應該包含類似這樣的環境變量設置:
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \ # 300秒=5分鐘containrrr/watchtower
常見錯誤:
- 拼寫錯誤:WATCHTOWER(錯誤) vs WATCHTOWER(正確)
- 值不是秒數:應該直接寫300(秒),而不是"5m"或"5 minutes"
2. 驗證環境變量
docker inspect watchtower | grep -i poll_interval
應該能看到類似:
"WATCHTOWER_POLL_INTERVAL=300"
三、排查更新未生效的原因
1. 檢查是否有鏡像更新
Watchtower
只會在鏡像倉庫有新版本時才會更新。確認你的鏡像確實有新版本:
docker pull 你的鏡像名:latest
docker images | grep 你的鏡像名
2. 檢查容器標簽
某些標簽會阻止 Watchtower
更新:
docker inspect 你的容器名 | grep -i watchtower.enable
如果看到 "com.centurylinklabs.watchtower.enable=false"
,說明該容器被排除在更新外。
3. 檢查監控范圍
默認 Watchtower
監控所有容器,但如果你指定了特定容器,確認包含了你想要更新的容器:
docker inspect watchtower | grep -A5 "Cmd"
四、測試 Watchtower 功能
1. 手動觸發檢查🎯
docker exec watchtower /watchtower --run-once
這會立即執行一次檢查更新操作,查看日志確認:
docker logs watchtower --tail 50
2. 創建測試容器
啟動一個專門用于測試的容器:
docker run -d --name test-watchtower alpine tail -f /dev/null
然后推送一個新版本的 alpine
鏡像到倉庫,觀察 Watchtower
是否會更新這個測試容器。
五、常見問題解決方案
1. 時間間隔不生效
可能原因:
- 環境變量名稱拼寫錯誤
- 值格式不正確(必須是秒數)
- Watchtower版本過舊
解決方案:
# 停止并刪除舊容器
docker stop watchtower && docker rm watchtower# 使用最新版Watchtower并正確設置
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower:latest
2. Watchtower 完全不工作
檢查點:
- 確保
Docker
守護進程正常運行 - 檢查
/var/run/docker.sock
的權限 - 嘗試使用
--debug
模式獲取更多日志信息:
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \-e WATCHTOWER_DEBUG=true \containrrr/watchtower
然后查看詳細日志:📃
docker logs watchtower
六、推薦的生產環境監控方案
對于生產環境,建議配置通知功能以便及時了解更新情況:
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e WATCHTOWER_POLL_INTERVAL=300 \-e WATCHTOWER_NOTIFICATIONS=email \-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=your@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=your@email.com \-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=yourpassword \containrrr/watchtower
通過以上步驟,你應該能夠確定為什么5分鐘更新間隔沒有生效,并根據具體情況解決問題。如果問題仍然存在,可以提供更多日志信息以便進一步診斷。
七、分析日志
上面方法我都試了,然而還是不行,我就把日志拷貝出來分析了下,后來恍然大悟,有沒有可能是我們拉取鏡像時沒有登錄授權,因為這個鏡像庫是私有的。一拍腦袋,沒錯。日志如下:
time="2025-05-07T07:36:21Z" level=debug msg="Got response to challenge request" header="Bearer realm=\"https://dockerauth.cn-hangzhou.aliyuncs.com/auth\",service=\"registry.aliyuncs.com:cn-beijing:26842\"" status="401 Unauthorized"
1. 阿里云私有倉庫認證失敗(主要問題)
多個容器出現類似錯誤:
time="2025-05-07T07:36:21Z" level=debug msg="No credentials for registry.cn-beijing.aliyuncs.com found"
time="2025-05-07T07:36:21Z" level=debug msg="Error pulling image registry.cn-beijing.aliyuncs.com/itdos/os.itdos.com:latest, Error response from daemon: pull access denied..."
問題分析:
- 所有來自
registry.cn-beijing.aliyuncs.com
的鏡像都無法拉取 Watchtower
沒有配置私有倉庫的認證信息- 錯誤明確顯示
"pull access denied"
根本原因:
私有倉庫需要登錄憑證,但 Watchtower
未配置這些憑證。
2. 解決方案
方案1:配置 Watchtower
使用私有倉庫憑證
方法A:通過環境變量傳遞憑證
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e REPO_USER=your_username \-e REPO_PASS=your_password \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower \--debug
方法B:使用 Docker
配置文件(推薦)
首先登錄私有倉庫:
docker login registry.cn-beijing.aliyuncs.com
然后啟動 Watchtower
并掛載 Docker
配置文件:
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-v $HOME/.docker/config.json:/config.json \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower
3. 問題解決
我用了第一種方法,通過環境變量傳遞憑證
docker run -d \--name watchtower \-v /var/run/docker.sock:/var/run/docker.sock \-e REPO_USER=your_username \-e REPO_PASS=your_password \-e WATCHTOWER_POLL_INTERVAL=300 \containrrr/watchtower \--debug
果然問題解決?