使用 watchtower 自動更新 docker images

Watchtower Docker API 版本不相容問題
  • 這問題已在 Watchtower GitHub 上被多人回報
    • Issue #2122 - 77+ 人反應相同問題(2025年11月11日開立)
    • Issue #2124, #2125, #2126 - 多個重複問題
    • 官方專案狀態:已停止維護超過 2 年(最後更新:2023年)
  • 內建的 Docker SDK 版本為 API 1.25(太舊)
  • 當 Alpine 升級到 3.23 的 Docker 29 要求最低 API 1.44 就會出現異常
  • 目前 Workaround 方式是改用 nickfedor fork 維護的 images
  • 更新 docker-compose.yml 語法

    cp docker-compose.yml docker-compose.yml.backup && \
    sed -i 's|containrrr/watchtower|nickfedor/watchtower|g' docker-compose.yml && \
    docker-compose down watchtower && \
    docker-compose up -d watchtower

  • .env 檔加入 THE_HOST

    echo THE_HOST=`hostname` >> .env

  • 在 docker-compose.yml 內 services: 加入 watchtower: Exp
    services:
      your-app:
        image: your-image:latest
        # 其他應用配置...
    
      watchtower:
        container_name: watchtower
        #image: containrrr/watchtower
        image: nickfedor/watchtower
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          - TZ=Asia/Taipei
          - WATCHTOWER_SCHEDULE=0 0 4 * * *  # 每天凌晨4點檢查更新
          - WATCHTOWER_CLEANUP=true  # 清理舊的映像檔
          #- WATCHTOWER_NOTIFICATIONS_HOSTNAME=${THE_HOST}
          #- WATCHTOWER_NOTIFICATIONS=shoutrrr  # 使用 Discord 通知
          #- WATCHTOWER_NOTIFICATION_URL=discord://token@id
          #- WATCHTOWER_NOTIFICATION_TITLE=Watchtower Update
          #- WATCHTOWER_NOTIFICATIONS_LEVEL=info
          #- WATCHTOWER_NOTIFICATIONS=slack  # 使用 Slack 通知
          #- SLACK_HOOK_URL=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
          #- WATCHTOWER_NOTIFICATIONS=email  # 使用 EMail 通知
          #- [email protected]
          #- [email protected]
          #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com
          #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
          #- [email protected]
          #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=app_password
          #- WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
        labels:
          - "com.centurylinklabs.watchtower.enable=true"
        restart: unless-stopped
  • 關於 WATCHTOWER_NOTIFICATION_URL 的設定
    • 假設您的 Discord webhook URL 是:

      https://discord.com/api/webhooks/123456789012345678/abcdefghijklmnopqrstuvwxyz1234567890

    • 需要轉換為 Shoutrrr 格式:

      discord://abcdefghijklmnopqrstuvwxyz1234567890@123456789012345678

  • 直接執行 docker cli

    docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nickfedor/watchtower --run-once

    或是

    docker compose run watchtower --run-once

  • 如果不想定期檢查更新, 可以透過呼叫 API 方式進行檢查更新
  • Exp. Listen Port:8383 , API-Token:mytoken-123456789
  • docker-compose.yml
    services:
      watchtower:
        container_name: watchtower
        #image: containrrr/watchtower
        image: nickfedor/watchtower
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        command: --http-api-update
        environment:
          - TZ=Asia/Taipei
          - WATCHTOWER_HTTP_API_TOKEN=mytoken-123456789
          - WATCHTOWER_CLEANUP=true
          - WATCHTOWER_NOTIFICATIONS=email
          - WATCHTOWER_NOTIFICATIONS_HOSTNAME=${THE_HOST}
          - WATCHTOWER_NOTIFICATIONS_HOSTNAME=myserver
          - [email protected]
          - [email protected]
          - WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com
          - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
          - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=myaccountid
          - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=mypassword
          - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
        labels:
          - "com.centurylinklabs.watchtower.enable=true"
        ports:
          - 8383:8080
        restart: unless-stopped
    • 呼叫 API 方式

      curl -H "Authorization: Bearer mytoken-123456789" http://localhost:8383/v1/update

  • tech/docker-upgrade.txt
  • 上一次變更: 2025/12/25 15:57
  • jonathan