Watchtower 是用於更新 docker 鏡像的工具,使用起來非常方便,牠能夠自動監測本地的鏡像與 Docker Hub 上的鏡像版本是否一致,並且能夠實現自動更新


# 安裝 Watchtower

安裝 Watchtower 非常简单,只需要從 Docker Hub 上拉取即可

docker pull Watchtower

# 食用方法

這是官方給出的使用方式,運行之後會在後台每 5in 檢測一次所有容器鏡像是否有更新,檢測到有更新後會自動停止、刪除容器(會保留資料),並拉取最新鏡像重新創建並啟動,更新之後的容器會保留之前的設置繼續運行。

docker run --detach \
	--name watchtower \
	--volume /var/run/docker.sock:/var/run/docker.sock \
	containrrr/watchtower

使用剛剛的方法會拉取最新鏡像,但並不會自動刪除舊有鏡像,時間一長就會佔用很大空間,這裡可以使用 --cleanup 選項,在更新完舊容器之後自動刪除舊鏡像

docker run -d \
    --name watchtower \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup

# 設置自動更新檢測頻率

Watchtower 默認是每 5min 檢測一次,如果需要更改週期,可以使用 --interval,-i 選項

如設定每消失小時檢測一次

docker run -d \
    --name watchtower \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    -i 3600

-i 3600 : 這裡的 3600 是設置的時間週期,單位是 3600 即 1 小時

# 指定更新檢測時間

除了設置頻率,還可以使用 --schedule,-s 選項指定時間
如指定每天 UTC+8 時間凌晨 3 點更新

docker run -d \
    --name watchtower \
    --restart always \
    -e TZ=Asia/Taipei \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    -s "0 0 3 * * *"

這裡的執行時間為 UTC 時間,如果不指定時區,會比台北的 UTC+8:00 時間晚 8 小時

# 制定需要更新的容器

如果不想更新所有容器,可以設置指定的容器進行更新
nginxnetdata 這兩個容器舉例

docker run -d \
    --name watchtower \
    --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    nginx netdata

這裡指定的容器只需要填寫容器名,而不是填寫該容器的鏡像名

# 手動更新

如果不想在使用容器時被自動更新打斷,可以使用 Watchtower 進行手動更新
由於是手動更新,Watchtower 只需要用到一次,可以添加 --rm--run-once 參數,在更新完之後過河拆橋

# 手動更新所有容器

docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    --run-once

# 手動更新指定容器

繼續以 nginxnetdata 這兩個容器舉例

docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup \
    --run-once \
    nginx netdata