ขี้เกียจอัพเดท Docker Container เอง มาติดตั้ง watchtower บน Synology NAS กันเถอะ!
เมื่อถึงจุดหนึ่งที่คุณติดตั้งอะไรต่าง ๆ นา ๆ ใน Docker แล้วก็เริ่มขี้เกียจมานั่งอัพเดท Container เอง เพราะมันเยอะ เสียเวลาชีวิต watchtower จะช่วยคุณได้ครับ
โดย watchtower จะทำการหาอัพเดท image ล่าสุดให้ ถ้ามี version ที่ใหม่กว่าของเรามันก็จะหยุด ลบ และติดตั้ง image ใหม่ให้ โดยอิงจากค่าที่เราตั้งมันไว้ตอนแรก โดยที่เราไม่ต้องทำอะไรกับมันเลย ลงแล้วก็ปล่อยเบลอ ลืม ๆ ไปซะ
ขั้นตอนติดตั้ง
Docker Run
- ขั้นแรกต้องลง Docker ไว้แล้ว ซึ่งก็น่าจะลงกันไว้หมดแล้วไม่งั้นคงไม่มาหาเครื่องทุ่นแรงอย่าง watchtower
- ไปที่
Control Panel > Task Schedulerเลือกจาก dropdownCreate > Scheduled Task > User-defined script
- tab General ตั้งชื่อ task เป็นอะไรก็ได้ไม่มีผลอะไร ส่วน user ให้เลือกเป็น root
- tab Schedule เราต้องการลงแค่ครั้งเดียว เลือกเป็น Do not repeat วันที่อะไรไม่ต้องไปยุ่ง
- tab Task Settings เลือกส่ง email แจ้งเตือนมาหาเรา แล้วก็ใส่เมลล์ตัวเองลงไป
- copy code ไปใส่ในช่องตามรูปด้านล่าง แล้วกด OK
docker run -d --name=watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
--restart=always \
containrrr/watchtower --cleanup
หลังจากนั้นให้เลือก task นี้แล้วกด Run หรือ คลิ๊กขวาที่ task นี้แล้ว Run ได้เลยครับ ถ้าไม่มีอะไรผิดพลาด watchtower มันจะไปโผล่ใน Docker tab Container เอง โดยตัวมันเองจะเช็คอัพเดททุก 24 ชั่วโมงครับ
Source https://containrrr.dev/watchtower/usage-overview/
Arguments
สำหรับคนที่ไม่สนจะตั้งค่าอะไร ก็ปล่อยให้มันทำงานไปได้เลย ส่วนนี้จะแนะนำ setting ที่น่าสนใจบางตัวเพิ่มเติม เผื่อใครอยากปรับแต่งให้เหมาะกับเรามากขึ้น
เลือกอัพเดทเฉพาะ Container
ในบางครั้งเราก็ไม่อยากให้ watchtower อัพเดททุกอย่างที่ติดตั้ง อาจจะเนื่องโปรแกรมยังไม่เสถียร อัพเดทแล้วพังบ่อย เราก็สามารถมาตั้งค่าเพิ่มได้ ใน docker run (ลบ container เดิมทิ้งแล้ว ใส่ใหม่เลย)
ดูบรรทัดที่ 5 จะเห็นว่า เราจะใส่ชื่อ container ที่ต้องการให้ watchtower เช็คเพื่ออัพเดท มีกี่อันก็เคาะช่องว่างไล่ไป
$ docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower --cleanup \
pihole Komga
Setting อื่น ๆ ที่น่าสนใจ
แบ่งเป็น 2 ส่วน คือ
- Argument - ส่วนนี้จะใช้ต่อท้ายใน docker run เหมือน cleanup ที่ใส่ไว้ให้แล้ว ถ้าจะใส่อะไรเพิ่มก็ต่อไปเรื่อย ๆ
- Environment Variable และ Value - สำหรับใส่ในส่วนของ Env ใน docker compose หรือยัดผ่าน GUI ของ Synology Docker ก็ได้
| Argument | Environment Variable | Value | What it does |
| --cleanup | WATCHTOWER_CLEANUP | true, false |
watchtower จะลบ image เก่าทิ้งหลังจากอัพเดทแล้ว |
| --interval 300 | WATCHTOWER_POLL_INTERVAL | 300 |
ตั้งเวลาวินาทีว่าจะให้ watchtower เช็คบ่อยแค่ไหน ในตัวอย่างคือ 300 วินาที หรือ 5 นาที ส่วนค่า default คือ 86400 (24 ช.ม.) |
| --schedule "0 0 4 * * *" | WATCHTOWER_SCHEDULE | 0 0 4 * * * | แทนที่จะตั้งเวลาเป็นวินาที ก็ตั้งเป็นกำหนดการแทน ตัวอย่างคือตี 4 ของทุกวัน ถ้าจะลองตั้งค่าอื่นไปดูได้ใน Cron expression generator |
| TZ | Asia/Bangkok | ตั้ง Time Zone บ้านเราก็ใช้เป็น Asia/Bangkok ไว้ใช้คู่กับ WATCHTOWER_SCHEDULE ให้ง่ายก็ใส่ไว้ใน Env ทั้งคู่ |
WATCHTOWER_POLL_INTERVAL กับ WATCHTOWER_SCHEDULE ให้เลือกใช้อย่างใดอย่างหนึ่ง
Arguments ทั้งหมดดูในจากที่นี่เลย
อื่น ๆ
run เช็คว่ามีอันไหนอัพเดทบ้าง
docker run -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once --monitor-only
run แบบครั้งเดียวพร้อมอัพเดท
docker run -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once
Docker-Compose
version: '3.3'
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
volumes:
- '/var/run/docker.sock:/var/run/docker.sock'
restart: always
environment:
- WATCHTOWER_SCHEDULE=0 0 4 * * *
# Removes old images after updating
- WATCHTOWER_CLEANUP=true
# Update containers that have a com.centurylinklabs.watchtower.enable label set to true.
- WATCHTOWER_LABEL_ENABLE=true
# Do not update containers that have com.centurylinklabs.watchtower.enable
# - WATCHTOWER_LABEL_ENABLE=false
# Will also include restarting containers
- WATCHTOWER_INCLUDE_RESTARTING=true
# Will also include created and exited containers
# - WATCHTOWER_INCLUDE_STOPPED=true
# Note that monitor-only can also be specified on a per-container basis
# with the com.centurylinklabs.watchtower.monitor-only label set on those containers.
# - WATCHTOWER_MONITOR_ONLY=true



