คู่มือ doctl CLI 2026 — จัดการ DigitalOcean ผ่าน Command Line
A hands-on guide to installing, authenticating, and automating DigitalOcean infrastructure management using doctl, the official command-line tool.
doctl คือ command-line interface อย่างเป็นทางการของ DigitalOcean ที่เปิดให้ developer จัดการ Droplet, Domain, Snapshot, Volume และทรัพยากรอื่นๆ ได้จาก terminal โดยไม่ต้องเปิดหน้าเว็บ control panel บทความนี้พาไล่เรียงตั้งแต่ติดตั้ง ตั้งค่า authentication ไปจนถึงคำสั่งพื้นฐานและการเขียนสคริปต์อัตโนมัติที่ใช้งานได้จริง
สารบัญ
doctl คืออะไร ทำไม developer ควรใช้
doctl คือ command-line interface อย่างเป็นทางการของ DigitalOcean ที่พัฒนาแบบ open source และเผยแพร่บน GitHub ที่ github.com/digitalocean/doctl ช่วยให้ developer จัดการทรัพยากรบน DigitalOcean แทบทุกประเภทได้จาก terminal โดยไม่ต้องเปิดเว็บ control panel ไม่ว่าจะเป็นการสร้าง ลบ หรือตรวจสอบสถานะ Droplet, จัดการ Domain และ DNS record, สร้างและกู้คืน Snapshot, ผูก Volume เข้ากับเซิร์ฟเวอร์ ไปจนถึงการดึง kubeconfig สำหรับ Managed Kubernetes (DOKS) มาใช้กับ kubectl โดยตรง เหตุผลหลักที่ developer ควรใช้ doctl แทนการคลิกผ่านหน้าเว็บคือความเร็วและความสามารถในการทำซ้ำ (repeatability) คำสั่งที่พิมพ์ครั้งเดียวสามารถบันทึกเป็นสคริปต์แล้วรันซ้ำได้ทุกครั้งโดยไม่ต้องจำขั้นตอนการคลิกในหน้า UI ซึ่งสำคัญมากเมื่อทีมต้องสร้างสภาพแวดล้อมทดสอบ (staging environment) ซ้ำๆ หรือทำลายทิ้งหลังใช้งานเสร็จเพื่อประหยัดค่าใช้จ่าย นอกจากนี้ doctl ยังรองรับการแสดงผลลัพธ์เป็น JSON ผ่าน flag -o json ทำให้สามารถต่อท่อ (pipe) เข้ากับเครื่องมืออย่าง jq เพื่อดึงข้อมูลเฉพาะส่วนไปใช้ในสคริปต์อื่นได้ทันที doctl ไม่ได้แข่งขันกับ Terraform provider อย่างเป็นทางการของ DigitalOcean (digitalocean/digitalocean บน Terraform Registry) แต่ทำหน้าที่ต่างกัน Terraform เหมาะกับการประกาศโครงสร้าง infrastructure แบบ declarative และจัดการ state ระยะยาว ส่วน doctl เหมาะกับงาน imperative ที่ต้องการรันคำสั่งทันที เช่น ตรวจสอบสถานะเซิร์ฟเวอร์ รีสตาร์ท Droplet แบบเร่งด่วน หรือดึงรายชื่อทรัพยากรทั้งหมดมาตรวจสอบระหว่างวัน ทีมจำนวนมากใช้ทั้งสองเครื่องมือร่วมกัน คือใช้ Terraform สร้างโครงสร้างพื้นฐานหลัก และใช้ doctl สำหรับงาน operations ประจำวันหรือ debugging สำหรับผู้ที่เริ่มต้นทำงานกับ DigitalOcean ผ่าน API เป็นครั้งแรก doctl ยังเป็นเครื่องมือที่ช่วยให้เข้าใจโครงสร้าง resource ของแพลตฟอร์มได้เร็วกว่าอ่านเอกสาร API ตรงๆ เพราะคำสั่งถูกจัดกลุ่มตามหมวดหมู่ชัดเจน เช่น doctl compute, doctl kubernetes, doctl databases, doctl apps ทำให้ค้นหาคำสั่งที่ต้องการได้ง่ายผ่าน --help ในทุกระดับ
doctl is DigitalOcean's official command-line interface, developed as open source and published on GitHub at github.com/digitalocean/doctl. It lets developers manage virtually any DigitalOcean resource from the terminal without opening the web control panel — whether creating, deleting, or checking Droplet status, managing Domains and DNS records, creating and restoring Snapshots, attaching Volumes to servers, or even fetching kubeconfig for Managed Kubernetes (DOKS) to use directly with kubectl.
The main reason developers should use doctl instead of clicking through the web interface is speed and repeatability. A command you type once can be saved as a script and run again exactly the same way every time, without needing to remember a sequence of UI clicks. This matters tremendously when teams need to spin up staging environments repeatedly or destroy them after testing to save money. Additionally, doctl supports outputting results as JSON via the -o json flag, making it trivial to pipe into tools like jq to extract specific data for use in other scripts.
doctl doesn't compete with DigitalOcean's official Terraform provider (digitalocean/digitalocean on Terraform Registry), but they serve different purposes. Terraform excels at declaring infrastructure structure declaratively and managing state over time, while doctl is better for imperative tasks that need immediate execution — checking server status, force-restarting a Droplet, or pulling a complete resource inventory for mid-day audits. Many teams use both together: Terraform provisions the core infrastructure and doctl handles daily operations or debugging.
For newcomers to DigitalOcean's API, doctl is a faster learning tool than reading the API docs directly because commands are organized into clear categories — doctl compute, doctl kubernetes, doctl databases, doctl apps — making it easy to discover commands via --help at any level.
- เป็น open source เผยแพร่ฟรีที่ github.com/digitalocean/doctl ไม่มีค่าใช้จ่ายในการใช้ตัวเครื่องมือเอง
- รองรับผลลัพธ์หลายรูปแบบ เช่น
-o jsonหรือ-o textเพื่อต่อเข้ากับสคริปต์อื่น - จัดกลุ่มคำสั่งตามประเภททรัพยากร เช่น
doctl compute,doctl kubernetes,doctl databases - ใช้ร่วมกับ Terraform ได้ — Terraform ดูแลโครงสร้างระยะยาว ส่วน doctl ใช้สำหรับงาน operations เฉพาะหน้า
- ทุกคำสั่งมี
--helpอธิบาย flag ที่ใช้ได้ ช่วยลดเวลาเปิดเอกสารภายนอก
ติดตั้ง doctl (brew/snap/binary)
สิ่งที่น่าสนใจคือ การติดตั้ง doctl มีหลายวิธีขึ้นอยู่กับระบบปฏิบัติการที่ใช้งาน สำหรับผู้ใช้ macOS วิธีที่ง่ายและอัพเดตง่ายที่สุดคือผ่าน Homebrew ด้วยคำสั่ง brew install doctl ซึ่งจะติดตั้ง binary ล่าสุดพร้อม dependency ที่จำเป็นให้อัตโนมัติ และเมื่อต้องการอัพเดตเวอร์ชันในภายหลังสามารถรันคำสั่ง brew upgrade doctl ได้ทันที
สำหรับผู้ใช้ Linux ที่ใช้ distro ซึ่งรองรับ Snap เช่น Ubuntu สามารถติดตั้งผ่านคำสั่ง snap install doctl ได้เลย โดย Snap จะจัดการเรื่อง sandbox และสิทธิ์การเข้าถึงไฟล์ให้ในระดับหนึ่ง ซึ่งอาจต้องอนุญาต permission เพิ่มเติมสำหรับการเข้าถึง SSH key ในโฟลเดอร์ home ด้วยคำสั่งเช่น snap connect doctl:ssh-keys หากพบปัญหาเรื่องสิทธิ์การเข้าถึงไฟล์ระหว่างใช้งานจริง
อีกวิธีที่ใช้ได้กับทุกระบบปฏิบัติการรวมถึง Windows คือการดาวน์โหลด binary สำเร็จรูปจากหน้า GitHub releases ของโปรเจกต์ที่ github.com/digitalocean/doctl/releases เลือกไฟล์ที่ตรงกับสถาปัตยกรรมเครื่อง (เช่น amd64 หรือ arm64) แตกไฟล์ tar.gz ด้วยคำสั่ง tar xf doctl-*.tar.gz แล้วย้ายไฟล์ที่ได้ไปไว้ในโฟลเดอร์ที่อยู่ใน PATH เช่น sudo mv doctl /usr/local/bin วิธีนี้เหมาะกับสภาพแวดล้อมที่ควบคุมเวอร์ชันเอง เช่นใน CI/CD pipeline ที่ต้องการ pin เวอร์ชันที่แน่นอนไม่ให้เปลี่ยนแปลงโดยไม่ตั้งใจ
เมื่อติดตั้งเสร็จแล้ว ควรตรวจสอบว่าเครื่องมือทำงานถูกต้องด้วยคำสั่ง doctl version ซึ่งจะแสดงเลขเวอร์ชันและ build metadata หากคำสั่งไม่พบให้ตรวจสอบว่าตำแหน่งที่ติดตั้ง binary อยู่ใน PATH ของ shell ที่ใช้งานอยู่จริงหรือไม่ โดยเฉพาะกรณีติดตั้งแบบ manual binary ที่ต้องเพิ่มโฟลเดอร์ปลายทางเข้า PATH เองในไฟล์ตั้งค่า shell เช่น .zshrc หรือ .bashrc
- macOS:
brew install doctlและอัพเดตด้วยbrew upgrade doctl - Linux (Snap):
snap install doctlอาจต้องsnap connect doctl:ssh-keysเพิ่ม - ทุก OS: ดาวน์โหลด binary จาก GitHub releases แล้วย้ายเข้า PATH เอง เหมาะกับ CI/CD ที่ต้อง pin เวอร์ชัน
- ตรวจสอบการติดตั้งด้วย
doctl version
Auth ด้วย Personal Access Token
ก่อนใช้งาน doctl ได้จริง ต้องผูกเครื่องมือเข้ากับบัญชี DigitalOcean ผ่าน Personal Access Token ก่อน โดยเริ่มจากสร้าง token ที่หน้า cloud.digitalocean.com/account/api/tokens เลือกตั้งชื่อ token ให้สื่อความหมาย เช่น ระบุเครื่องหรือวัตถุประสงค์ที่ใช้ และเลือกระดับสิทธิ์ให้เหมาะกับงาน หากต้องการแค่ดูข้อมูล (list/get) ให้เลือกสิทธิ์ read-only เพื่อลดความเสี่ยงหาก token รั่วไหล แต่ถ้าต้องการสร้างหรือลบทรัพยากรผ่านสคริปต์อัตโนมัติจำเป็นต้องใช้สิทธิ์ read และ write เต็มรูปแบบ
หลังจากได้ token มาแล้ว ให้รันคำสั่ง doctl auth init ในเครื่อง ระบบจะถามให้วาง token ที่คัดลอกมา แล้วบันทึกไว้ในไฟล์ config ของ doctl (โดยทั่วไปอยู่ที่ ~/.config/doctl/config.yaml) จุดที่มีประโยชน์มากคือ doctl รองรับการสร้างหลาย context ในเครื่องเดียว เหมาะกับคนที่ดูแลหลายบัญชี DigitalOcean เช่น บัญชีงานกับบัญชีส่วนตัว โดยใช้คำสั่ง doctl auth init --context work เพื่อสร้าง context ใหม่ชื่อ work แล้วสลับไปมาระหว่าง context ด้วยคำสั่ง doctl auth switch --context work และตรวจสอบว่ามี context อะไรบ้างด้วย doctl auth list
สำหรับ pipeline อัตโนมัติอย่าง CI/CD ที่ไม่สามารถตอบโต้แบบ interactive ได้ doctl รองรับการอ่าน token จาก environment variable ชื่อ DIGITALOCEAN_ACCESS_TOKEN โดยตรง หรือส่ง token ผ่าน flag -t ในทุกคำสั่งก็ได้เช่นกัน เช่น doctl -t $DIGITALOCEAN_ACCESS_TOKEN compute droplet list วิธีนี้ทำให้ไม่ต้องรัน auth init แบบ interactive ในสภาพแวดล้อมที่ไม่มีการโต้ตอบกับผู้ใช้
หลังตั้งค่าเสร็จ ควรทดสอบว่าการเชื่อมต่อใช้งานได้จริงด้วยคำสั่ง doctl account get ซึ่งจะดึงข้อมูลบัญชี เช่น อีเมลและสถานะการยืนยันตัวตนกลับมาแสดง หาก token หมดอายุหรือถูก revoke ไปแล้วจากหน้าเว็บ คำสั่งนี้จะแจ้ง error ทันทีทำให้รู้ได้เร็วว่าต้องสร้าง token ใหม่ ควรหลีกเลี่ยงการฝัง token ลงในไฟล์ที่ commit เข้า git repository โดยเด็ดขาด และใช้ secret manager ของระบบ CI/CD แทนเสมอ
- สร้าง token ที่ cloud.digitalocean.com/account/api/tokens เลือกสิทธิ์ read-only หรือ read+write ตามงาน
doctl auth initสำหรับตั้งค่าแบบ interactive ครั้งแรกdoctl auth init --context ชื่อและdoctl auth switch --context ชื่อสำหรับจัดการหลายบัญชี
คำสั่งพื้นฐาน: สร้าง/ลบ/ดู Droplet
คำสั่งกลุ่ม doctl compute droplet คือส่วนที่ใช้งานบ่อยที่สุดสำหรับ developer ส่วนใหญ่ เพราะครอบคลุมวงจรชีวิตทั้งหมดของ Droplet ตั้งแต่สร้างจนถึงลบ การสร้าง Droplet ใหม่ทำได้ด้วยคำสั่งประมาณ doctl compute droplet create mydroplet --region sgp1 --image ubuntu-22-04-x64 --size s-1vcpu-1gb --ssh-keys <fingerprint> โดยต้องระบุ region, image (OS ที่ต้องการ), size (สเปกเครื่อง) และ SSH key ที่จะใช้ล็อกอินเป็นอย่างน้อย สำหรับผู้ใช้ในไทย region sgp1 (Singapore) เป็นตัวเลือกที่อยู่ใกล้ที่สุดและ latency ต่ำสุดเมื่อเทียบกับ region อื่นของ DigitalOcean
ก่อนสร้าง Droplet จริง สามารถตรวจสอบค่าที่ใช้ได้ก่อนด้วยคำสั่งช่วยเหลือหลายตัว เช่น doctl compute region list เพื่อดู region ทั้งหมด, doctl compute size list เพื่อดูสเปกเครื่องที่เปิดให้เลือก, doctl compute image list --public เพื่อดู OS image ที่ DigitalOcean เตรียมไว้ให้ และ doctl compute ssh-key list เพื่อดู SSH key ที่เคยอัปโหลดไว้ในบัญชีพร้อม fingerprint ที่ใช้อ้างอิงตอนสร้าง Droplet ตัวอย่างเช่น Droplet ขนาด 1 GiB RAM / 1 vCPU เริ่มต้นที่ $6 ต่อเดือนตามราคาที่ DigitalOcean ประกาศไว้
หลังสร้างแล้ว ใช้คำสั่ง doctl compute droplet list เพื่อดูรายการ Droplet ทั้งหมดในบัญชีพร้อม IP address และสถานะ หากต้องการดูรายละเอียดเฉพาะตัวใช้ doctl compute droplet get <id> และหากต้องการลบทิ้งใช้ doctl compute droplet delete <id> ซึ่งจะถามยืนยันก่อนลบเสมอ เว้นแต่จะเติม flag --force เพื่อข้ามการถาม เหมาะกับสคริปต์อัตโนมัติที่รันแบบไม่มีคนตอบโต้
การควบคุมสถานะเครื่องระหว่างใช้งาน เช่น reboot, power off, resize ทำผ่านกลุ่มคำสั่ง doctl compute droplet-action เช่น doctl compute droplet-action reboot <id> หรือ doctl compute droplet-action power-cycle <id> และหากต้องการ SSH เข้าเครื่องโดยตรงโดยไม่ต้องจำ IP เอง สามารถใช้ doctl compute ssh <droplet-name> ซึ่ง doctl จะค้นหา IP ให้อัตโนมัติจากชื่อ Droplet
doctl compute droplet create ชื่อ --region sgp1 --image ubuntu-22-04-x64 --size s-1vcpu-1gb --ssh-keys <fingerprint>สร้าง Droplet ใหม่doctl compute region list,doctl compute size list,doctl compute image list --publicเช็คค่าที่ใช้ได้ก่อนสร้างจริงdoctl compute droplet listและdoctl compute droplet get <id>ดูรายการและรายละเอียด
จัดการ Domain, Snapshot, Volume ผ่าน doctl
ในประสบการณ์ของเรา นอกจาก Droplet แล้ว doctl ยังจัดการทรัพยากรสำคัญอื่นๆ ได้ครบผ่าน command line เริ่มจากการจัดการ Domain และ DNS record กลุ่มคำสั่ง doctl compute domain ใช้เพิ่มโดเมนเข้าสู่ DigitalOcean DNS ได้ด้วย doctl compute domain create example.com --ip-address <IP> ซึ่งจะสร้าง A record ตัวแรกให้อัตโนมัติ ส่วนการเพิ่ม record ย่อยอื่นๆ เช่น subdomain ทำผ่าน doctl compute domain records create example.com --record-type A --record-name www --record-data <IP> และดูรายการ record ทั้งหมดด้วย doctl compute domain records list example.com
สำหรับการสำรองข้อมูลด้วย Snapshot สามารถสร้าง snapshot ของ Droplet ทั้งเครื่องได้ผ่าน doctl compute droplet-action snapshot <droplet-id> --snapshot-name mybackup ซึ่งจะหยุดเครื่องชั่วคราวระหว่างถ่ายภาพ (แนะนำให้ทำตอนโหลดต่ำ) จากนั้นดูรายการ snapshot ทั้งหมดด้วย doctl compute snapshot list และลบ snapshot ที่ไม่ใช้แล้วด้วย doctl compute snapshot delete <id> ค่าใช้จ่ายของ Droplet snapshot อยู่ที่ $0.06 ต่อ GiB ต่อเดือน ตามพื้นที่จริงที่ snapshot ใช้ ไม่ใช่ตามขนาด disk เต็มของ Droplet
ส่วน Volume หรือ Block Storage แยกต่างหากจาก disk หลักของ Droplet เหมาะกับกรณีต้องการพื้นที่เก็บข้อมูลที่ขยายหรือย้ายไปมาระหว่างเครื่องได้อิสระ สร้างได้ด้วย doctl compute volume create myvolume --region sgp1 --size 100GiB และผูกเข้ากับ Droplet ด้วย doctl compute volume-action attach <volume-id> <droplet-id> ราคาของ Volume อยู่ที่ $0.10 ต่อ GiB ต่อเดือน เช่น Volume ขนาด 100 GiB จะมีค่าใช้จ่ายราว $10 ต่อเดือน และหากต้องการสำรอง Volume เองก็ทำ snapshot ได้เช่นกันผ่าน doctl compute volume-action snapshot <volume-id> --snapshot-name <ชื่อ> ซึ่งคิดค่าใช้จ่ายในอัตรา $0.06 ต่อ GiB ต่อเดือนเช่นเดียวกับ Droplet snapshot
จุดที่ควรระวังคือ Volume ที่สร้างไว้แต่ไม่ได้ผูกกับ Droplet ใดเลยยังคงถูกคิดค่าใช้จ่ายตามขนาดที่จองไว้อยู่ดี ดังนั้นควรใช้ doctl compute volume list ตรวจสอบเป็นระยะเพื่อไม่ให้มี Volume ค้างที่ไม่ได้ใช้งานจริงสะสมค่าใช้จ่ายโดยไม่จำเป็น
doctl compute domain create example.com --ip-address <IP>และdoctl compute domain records create ...จัดการ DNS recorddoctl compute droplet-action snapshot <id> --snapshot-name ...สำรอง Droplet ทั้งเครื่อง ค่าใช้จ่าย $0.06/GiB/เดือนdoctl compute volume create ... --size 100GiBสร้าง Block Storage แยกจาก disk หลัก ราคา $0.10/GiB/เดือนdoctl compute volume-action attach/detachผูก/ถอด Volume เข้ากับ Droplet
เขียนสคริปต์อัตโนมัติด้วย doctl
จุดแข็งที่แท้จริงของ doctl จะเห็นได้ชัดเมื่อนำไปรวมกับสคริปต์อัตโนมัติแทนการรันทีละคำสั่ง เพราะทุกคำสั่งรองรับการแสดงผลเป็น JSON ผ่าน flag -o json ทำให้ต่อท่อเข้ากับ jq เพื่อดึงเฉพาะข้อมูลที่ต้องการไปใช้ต่อในสคริปต์ bash ได้ทันที เช่น การดึง IP ของ Droplet ทั้งหมดที่มี tag ว่า staging มาวนลูปแล้วสั่งลบทิ้งหลังเทสต์เสร็จ หรือดึงรายชื่อ snapshot ที่เก่ากว่าจำนวนวันที่กำหนดมาลบอัตโนมัติเพื่อคุมค่าใช้จ่าย
สำหรับการใช้งานใน CI/CD pipeline เช่น GitHub Actions หรือ GitLab CI ขั้นตอนทั่วไปคือติดตั้ง doctl ในขั้นตอน setup ของ pipeline ด้วยการดาวน์โหลด binary จาก GitHub releases โดยตรง (เร็วกว่าและควบคุมเวอร์ชันได้แน่นอนกว่าติดตั้งผ่าน package manager) จากนั้นเก็บ Personal Access Token ไว้ใน secret ของระบบ CI/CD แล้วส่งเข้าเป็น environment variable ชื่อ DIGITALOCEAN_ACCESS_TOKEN ให้ doctl อ่านโดยอัตโนมัติโดยไม่ต้องรัน auth init แบบ interactive เลย
เมื่อสั่งสร้างทรัพยากรในสคริปต์ที่ต้องรอให้พร้อมใช้งานก่อนขั้นตอนถัดไป เช่น deploy แอปทันทีหลังสร้าง Droplet เสร็จ ควรเติม flag --wait ต่อท้ายคำสั่ง create เพื่อให้ doctl บล็อกการทำงานจนกว่า Droplet จะมีสถานะ active จริง แทนที่จะปล่อยให้สคริปต์ทำงานขั้นตอนถัดไปทันทีทั้งที่เครื่องยังสร้างไม่เสร็จ ซึ่งเป็นสาเหตุความล้มเหลวที่พบบ่อยในสคริปต์อัตโนมัติที่เขียนแบบเร่งรีบ
อีกกรณีที่ใช้บ่อยคือการดึง kubeconfig ของ Managed Kubernetes มาต่อกับ kubectl อัตโนมัติด้วยคำสั่ง doctl kubernetes cluster kubeconfig save <cluster-id> ซึ่งช่วยให้ pipeline deploy ขึ้น cluster ได้โดยไม่ต้องดาวน์โหลด config ไฟล์ผ่านหน้าเว็บด้วยมือ เหมาะสำหรับ deployment pipeline ที่ต้องรันซ้ำหลายครั้งต่อวัน
สำหรับสคริปต์ที่จะรันแบบไม่มีคนเฝ้า ควรเขียนด้วยความระมัดระวังเรื่อง error handling เสมอ เช่น ใช้ set -euo pipefail ในสคริปต์ bash เพื่อให้สคริปต์หยุดทันทีเมื่อคำสั่งใดคำสั่งหนึ่งล้มเหลว แทนที่จะทำงานต่อไปทั้งที่ขั้นตอนก่อนหน้าผิดพลาด และควรใส่ retry logic รอบคำสั่งที่เรียก API ภายนอก เพราะ error ชั่วคราวจากฝั่งเครือข่ายหรือ rate limit เกิดขึ้นได้เป็นปกติในระบบอัตโนมัติที่รันถี่
- ใช้
-o jsonต่อท่อกับjqเพื่อดึงข้อมูลเฉพาะส่วนไปใช้ในสคริปต์ - CI/CD: ติดตั้งจาก GitHub releases binary + เก็บ token เป็น secret ผ่าน
DIGITALOCEAN_ACCESS_TOKEN - เติม
--waitตอนสร้างทรัพยากรที่ขั้นตอนถัดไปต้องรอให้พร้อมใช้งานก่อน
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
จากที่เราทดสอบจริง — หนึ่งใน error ที่พบบ่อยที่สุดเมื่อเริ่มใช้ doctl คือข้อความประเภท "Unable to initialize DigitalOcean API client" หรือ "401 Unauthorized" ซึ่งมักเกิดจาก token ที่ยังไม่ได้ตั้งค่า หมดอายุ หรือถูก revoke ไปแล้วจากหน้าเว็บ วิธีตรวจสอบเบื้องต้นคือรัน doctl account get ถ้าเชื่อมต่อไม่ได้ให้ตรวจสอบว่า context ที่ใช้งานอยู่ (doctl auth list) ชี้ไปยัง token ที่ถูกต้อง และลอง doctl auth init ใหม่เพื่อวาง token ที่สร้างขึ้นล่าสุด
อีกปัญหาที่พบได้บ่อยคือการสร้างหรือลบทรัพยากรไม่สำเร็จเพราะ token ที่ใช้มีสิทธิ์เป็น read-only เท่านั้น อาการที่เจอมักเป็น error แจ้ง 403 Forbidden แม้ auth ผ่านแล้วก็ตาม วิธีแก้คือกลับไปที่หน้า cloud.digitalocean.com/account/api/tokens แล้วสร้าง token ใหม่ที่มีสิทธิ์ write หรือแก้ scope ของ token เดิม เพราะ token ที่สร้างไว้เป็น read-only ตั้งแต่ต้นมักไม่สามารถอัพเกรดสิทธิ์แบบ in-place ได้เสมอไป ต้องตรวจสอบให้แน่ใจก่อนใช้ในสคริปต์ automation ที่ต้องสร้างหรือลบทรัพยากรจริง
สำหรับสคริปต์ที่ parse ผลลัพธ์จาก doctl ปัญหาที่พบบ่อยคือการ parse ผลลัพธ์แบบ text (ตาราง) แล้วเจอปัญหาคอลัมน์เลื่อนหรือค่าที่มีช่องว่างทำให้ split ผิดตำแหน่ง วิธีแก้ที่แนะนำคือเปลี่ยนไปใช้ -o json เสมอสำหรับสคริปต์ที่ต้อง parse ผลลัพธ์ต่อ เพราะ JSON มีโครงสร้างแน่นอนไม่ขึ้นกับความกว้างของข้อความ แล้วดึงค่าด้วย jq แทนการตัด string เอง ซึ่งเสถียรกว่ามากในระยะยาว
เมื่อเรียกคำสั่ง doctl ถี่เกินไปในเวลาสั้นๆ โดยเฉพาะในสคริปต์ที่วนลูปเรียก API ต่อเนื่อง อาจเจอ error ที่เกี่ยวกับการเรียกเกิน rate limit ของ DigitalOcean API วิธีจัดการคือเพิ่ม delay ระหว่างการเรียกแต่ละครั้ง หรือลดจำนวนการเรียกด้วยการดึงข้อมูลเป็นชุดใหญ่ครั้งเดียว เช่น doctl compute droplet list ครั้งเดียวแล้ว filter ด้วย jq แทนการ get ทีละตัวในลูป และควรใส่ retry logic ที่รอสักครู่แล้วลองใหม่เมื่อเจอ error ชั่วคราวจากฝั่งเครือข่ายหรือ API แทนที่จะปล่อยให้สคริปต์ล้มเหลวทันที
- 401 Unauthorized: ตรวจ token ด้วย
doctl account getและdoctl auth listแล้วdoctl auth initใหม่ถ้า token หมดอายุหรือถูก revoke - 403 Forbidden ทั้งที่ auth ผ่าน: token มักมีสิทธิ์ read-only เท่านั้น ต้องสร้าง token ใหม่ที่มีสิทธิ์ write
- Parse ผลลัพธ์ผิดพลาด: เปลี่ยนจาก text/table เป็น
-o jsonแล้วดึงค่าด้วย jq แทนการตัด string เอง - เจอ rate limit เมื่อเรียกถี่ในลูป: ดึงข้อมูลเป็นชุดใหญ่ครั้งเดียวแทนการวน get ทีละรายการ พร้อมใส่ delay/retry
- คำสั่งไม่ทำงานหลังติดตั้ง: ตรวจสอบว่า binary อยู่ใน PATH จริงด้วย
which doctlและdoctl version
แนวทางปฏิบัติที่ดีที่สุด (Best Practices)
เมื่อใช้ doctl ในงานจริงโดยเฉพาะในทีมหรือ pipeline อัตโนมัติ มีแนวทางปฏิบัติหลายข้อที่ช่วยให้ปลอดภัยและดูแลรักษาง่ายขึ้นในระยะยาว เริ่มจากเรื่อง token ควรสร้าง Personal Access Token แยกตามวัตถุประสงค์การใช้งานแทนการใช้ token เดียวใช้ร่วมกันทุกที่ เช่น token สำหรับ CI/CD แยกจาก token ที่ใช้บนเครื่องส่วนตัว เพื่อให้ revoke เฉพาะจุดได้ทันทีหากจุดใดจุดหนึ่งรั่วไหลโดยไม่กระทบระบบอื่น และควรใช้สิทธิ์ read-only ทุกครั้งที่งานนั้นไม่จำเป็นต้องสร้างหรือลบทรัพยากรจริง
เรื่องการจัดเก็บ token ห้าม hardcode ลงในสคริปต์หรือ commit เข้า git repository โดยเด็ดขาด ควรใช้ environment variable ร่วมกับ secret manager ของระบบ เช่น GitHub Actions secrets, GitLab CI/CD variables หรือเครื่องมือจัดการ secret แยกต่างหาก แล้วให้ doctl อ่านผ่าน DIGITALOCEAN_ACCESS_TOKEN โดยอัตโนมัติแทนการส่ง token เป็น argument ตรงๆ ในคำสั่ง เพราะ argument ของ process มักถูกบันทึกไว้ใน shell history หรือ log ของระบบโดยไม่ตั้งใจ
สำหรับรูปแบบสคริปต์ ควรเลือกใช้ -o json เป็นค่าเริ่มต้นทุกครั้งที่ผลลัพธ์จะถูกนำไปประมวลผลต่อ แทนการอ่านผลลัพธ์แบบ text ด้วยตาเปล่าแล้วค่อย parse เอง และควรใช้ flag --format เพื่อระบุเฉพาะคอลัมน์ที่ต้องการเมื่อดูผลลัพธ์แบบ text บนหน้าจอ ช่วยให้ output อ่านง่ายและไม่ต้องกรองข้อมูลส่วนเกินทิ้งเอง นอกจากนี้สคริปต์ที่ทำงานแบบ non-interactive ทุกตัวควรเติม --force ในคำสั่งที่ปกติต้องถามยืนยัน เช่นคำสั่งลบ เพื่อไม่ให้สคริปต์ค้างรอ input ที่ไม่มีทางได้รับ
ในระดับทีม ควรกำหนดให้ทุกคนติดตั้ง doctl เวอร์ชันเดียวกันหรือใกล้เคียงกันผ่านการ pin เวอร์ชัน เช่น ระบุเวอร์ชันไว้ใน README หรือใช้ version manager อย่าง asdf/mise เพื่อลดปัญหาพฤติกรรมคำสั่งต่างกันระหว่างเครื่อง และควรรีวิวสคริปต์ที่เรียก doctl compute droplet delete หรือคำสั่งลบทรัพยากรอื่นๆ อย่างละเอียดก่อน merge เข้าสาขาหลักเสมอ เพราะคำสั่งเหล่านี้ทำลายข้อมูลจริงและมักไม่มีทางย้อนกลับได้หากไม่มี snapshot สำรองไว้ก่อน
- แยก Personal Access Token ตามวัตถุประสงค์ (CI/CD, เครื่องส่วนตัว) เพื่อ revoke เฉพาะจุดได้เมื่อรั่วไหล
- เก็บ token ผ่าน secret manager/CI secrets เท่านั้น อ่านผ่าน
DIGITALOCEAN_ACCESS_TOKENห้าม hardcode หรือส่งเป็น argument ตรงๆ - ใช้
-o jsonเป็นค่าเริ่มต้นในสคริปต์ ใช้--formatจำกัดคอลัมน์เมื่อดูผลลัพธ์แบบ text