Dagger Shell - เชลล์แบบใหม่สำหรับยุคคอนเทนเนอร์
(dagger.io)- Unix shell ถูกใช้งานมานานกว่า 50 ปี และเป็นเครื่องมือคอมพิวติ้งทรงพลังที่สามารถประกอบการทำงานซับซ้อนจากคำสั่งง่าย ๆ ได้
- แต่สแตกซอฟต์แวร์สมัยใหม่ซับซ้อนขึ้นมาก และเชลล์แบบเดิมก็จัดการงานทั้งหมดนี้ได้ยาก
- โดยได้แรงบันดาลใจจาก Docker, make, powershell, nix ฯลฯ จึงเกิดความต้องการเชลล์สมัยใหม่ที่รองรับคอนเทนเนอร์, ซีเคร็ต, service endpoint, การรันแบบ declarative, แคช และ sandboxing ได้ในตัว
- Dagger Shell คือฟรอนต์เอนด์สำหรับ Dagger Engine ที่ใช้ไวยากรณ์แบบ bash และสามารถนำไปใช้กับงานอัตโนมัติหลากหลาย เช่น การ build, test, deploy และสภาพแวดล้อมชั่วคราว
- เป็นเครื่องมือที่เข้ามาเสริม ไม่ได้มาแทนที่ system shell โดยช่วยให้สร้างเวิร์กโฟลว์ที่ซับซ้อนจากการประกอบโมดูลแบบง่าย ๆ ได้
container | from alpine | with-exec apk add git | terminal -
มีแค่เชลล์กับโค้ดก็เพียงพอ
- แทนที่จะต้องเรียน DSL แปลก ๆ เพื่อจัดการสคริปต์ซับซ้อน ก็สามารถเขียนด้วยภาษาโปรแกรมจริงได้
- มี SDK ให้สำหรับหลายภาษา เช่น Go, Python, Typescript, Java, PHP ฯลฯ
- สามารถขยายฟังก์ชันที่เขียนด้วยภาษาเหล่านั้นให้กลายเป็น primitive ใหม่ของ Dagger ได้
-
เชลล์ที่เชื่อมต่อกับ API
- Dagger Shell ทำหน้าที่เป็น Dagger API client ทำให้เข้าถึงอ็อบเจ็กต์ที่มีการกำหนด type, เอกสารประกอบ และระบบนิเวศของโมดูลที่นำกลับมาใช้ซ้ำได้อย่าง Daggerverse
- ตัวอย่างเช่น สามารถโหลดและรันโมดูลสแกนความปลอดภัย Trivy ได้
-
สภาพแวดล้อม sandbox เป็นค่าเริ่มต้น
- ทุกคำสั่งจะถูกรันใน sandbox โดยค่าเริ่มต้น และการเข้าถึงไฟล์, ซีเคร็ต, service ฯลฯ ต้องระบุอย่างชัดเจน แม้จะเขียนยาวขึ้นเล็กน้อย แต่ก็เพิ่มความสามารถในการทำซ้ำและความปลอดภัย
container | from alpine | with-secret-variable POSTGRES_PASSWORD op://dev/db-password/credential | with-directory /src ~/src/myapp | with-service-binding db tcp://localhost:5432 | terminal
- ทุกคำสั่งจะถูกรันใน sandbox โดยค่าเริ่มต้น และการเข้าถึงไฟล์, ซีเคร็ต, service ฯลฯ ต้องระบุอย่างชัดเจน แม้จะเขียนยาวขึ้นเล็กน้อย แต่ก็เพิ่มความสามารถในการทำซ้ำและความปลอดภัย
-
การ build คอนเทนเนอร์แบบง่าย
- สามารถสร้างคอนเทนเนอร์บน Alpine, แทรกไฟล์ข้อความ, ตั้งค่าการแสดงข้อความ และ push ไปยังรีจิสทรีชั่วคราวได้ในครั้งเดียว
- ทำทั้งหมดได้โดยไม่ต้องสลับบริบทไปมาระหว่างการเขียน Dockerfile, รันคำสั่ง build และ push
# Build a wolfi linux container with curl, then test connection to stable and dev docs github.com/dagger/dagger/modules/wolfi | container --packages=curl | with-service-binding docs-stable $(github.com/dagger/dagger/docs@v0.17.1 | server) | with-service-binding docs-dev $(github.com/dagger/dagger/docs@main | server) | with-exec curl http://docs-stable | with-exec curl http://docs-dev
-
การตั้งค่าสภาพแวดล้อมทดสอบ
- แม้แต่การตั้งค่าสภาพแวดล้อมทดสอบ ซึ่งเป็นปัญหาที่พบบ่อยใน CI ก็จัดการได้อย่างง่ายดาย
- ด้วยการรองรับ service binding แบบเนทีฟ จึงสามารถเชื่อมต่อและทดสอบกับหลาย live instance ได้
repo=$(git https://github.com/dagger/hello-dagger | head | tree) env=$(container | from node:23 | with-directory /app $repo | with-workdir /app) build=$($env | with-exec npm install | with-exec npm run build | directory ./dist) container | from nginx | with-directory /usr/share/nginx/html $build | terminal --cmd=/bin/bash
-
การ build หลายสเตจ (Multi-Stage Builds)
- สามารถสร้าง build pipeline ที่ซับซ้อนได้ด้วยไวยากรณ์ที่ชัดเจนและเป็นโมดูล
- ระบุแต่ละขั้นตอนเป็นตัวแปรอย่างชัดเจน ทำให้ดีบักและนำกลับมาใช้ซ้ำได้ง่าย
container | from golang:latest | with-directory /src $(git https://github.com/dagger/dagger | head | tree) | with-workdir /src | with-exec go build ./cmd/dagger | file ./dagger | export ./dagger
2 ความคิดเห็น
อ้างอิงไว้ก่อนว่า ลิงก์ได้เปลี่ยนเป็น https://dagger.io/blog/… แล้ว
ความคิดเห็นบน Hacker News
ช่วงนี้รู้สึกว่าเข้าใจการใช้งานจริงของ Dagger ได้ยากขึ้นเรื่อยๆ
มักต้องใช้ Dockerfile ผสมกับเชลล์สคริปต์เพื่อประกอบอิมเมจหลายแบบ
พลาดไปเลยว่า Dagger กำลังพยายามมาแทน Docker
มีเว็บ UI ที่ทำไว้แล้วสำหรับเขียนสคริปต์ Dagger Shell ในรูปแบบโน้ตบุ๊ก
ดูคำอธิบายบนหน้าแรกของ Dagger แล้วเกิดคำถามขึ้นมา
โปรโมตผลงานที่เกี่ยวข้อง
จุดประสงค์คือจะทำงานพัฒนาภายในคอนเทนเนอร์ใช่ไหม?
เอาให้ชัด เครื่องมือนี้ทำอะไรได้บ้าง?
ความประทับใจแรกคือมันเหมือนอยู่กึ่งกลางระหว่าง Dockerfile กับการนิยามและประกอบซอฟต์แวร์ด้วยโค้ดจริง
Dagger เปลี่ยนทิศทางผลิตภัณฑ์หรือเปล่า?