2 คะแนน โดย GN⁺ 2025-04-02 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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  
      
  • การ 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 ความคิดเห็น

 
winterjung 2025-04-02

อ้างอิงไว้ก่อนว่า ลิงก์ได้เปลี่ยนเป็น https://dagger.io/blog/… แล้ว

 
GN⁺ 2025-04-02
ความคิดเห็นบน Hacker News
  • ช่วงนี้รู้สึกว่าเข้าใจการใช้งานจริงของ Dagger ได้ยากขึ้นเรื่อยๆ

    • ตอนแรกคาดหวังว่ามันจะมาแทน Jenkins ได้
    • เป็นทางเลือกที่ให้รันและดีบัก CI pipeline บนเครื่องโลคัลได้
    • เขียนด้วย Golang และสามารถดึงสิ่งที่ต้องใช้มาใช้ได้
    • ตอนนี้ทิศทางดูสับสน ทั้งพยายามมาแทน Docker พยายามเป็นเชลล์ใหม่ และแปลกๆ เหมือนพยายามจะเป็น Langchain
    • อาร์กิวเมนต์ CLI แบบใหม่ก็ไม่ได้ดีกว่าเชลล์สคริปต์หรือ Jenkinsfile เดิมเท่าไร
    • น่าเสียดายที่โปรเจกต์เหมือนจะออกห่างจากเป้าหมายเดิม
  • มักต้องใช้ Dockerfile ผสมกับเชลล์สคริปต์เพื่อประกอบอิมเมจหลายแบบ

    • ต้องรันต่างกันตามสภาพแวดล้อม เช่น เครื่องนักพัฒนา, หุ่นยนต์, CI เป็นต้น
    • เครื่องมือนี้ดูเหมือนจะช่วยแก้ความซับซ้อนนั้นได้
    • ชอบตรงที่อ้างอิงผลลัพธ์ของการ build ได้ จึงไม่ต้องคอยจัดการแท็ก
  • พลาดไปเลยว่า Dagger กำลังพยายามมาแทน Docker

    • เป็นวิสัยทัศน์ที่ใหญ่
    • เป็นความพยายามที่ทะเยอทะยาน แต่ยังยากจะเชื่อว่าจะมาแทนเครื่องมือเดิมได้ในตอนนี้
    • เสียดายที่เลือกความเข้ากันได้กับ Bash
    • คิดว่าน่าจะถึงเวลาต้องก้าวพ้นไวยากรณ์และปัญหาของ Bash แล้ว
  • มีเว็บ UI ที่ทำไว้แล้วสำหรับเขียนสคริปต์ Dagger Shell ในรูปแบบโน้ตบุ๊ก

    • น่าสนใจมาก แนะนำให้ลองดู
  • ดูคำอธิบายบนหน้าแรกของ Dagger แล้วเกิดคำถามขึ้นมา

    • "เอนจินสำหรับการประกอบข้ามแพลตฟอร์ม"
    • สร้างสภาพแวดล้อมซอฟต์แวร์ที่ทรงพลังด้วยองค์ประกอบแบบโมดูลาร์และฟังก์ชันเรียบง่าย
    • เหมาะกับงาน build ที่ซับซ้อนและ AI workflow
    • มันกว้างเกินไปจนไม่ค่อยมีประโยชน์
    • ทุกอย่างก็เป็นเอนจินสำหรับการประกอบได้หมด ทั้ง Javascript และ macOS ก็ด้วย
  • โปรโมตผลงานที่เกี่ยวข้อง

  • จุดประสงค์คือจะทำงานพัฒนาภายในคอนเทนเนอร์ใช่ไหม?

    • ทำให้นึกถึง Devbox ของ Jetify และ Flox.dev
  • เอาให้ชัด เครื่องมือนี้ทำอะไรได้บ้าง?

    • มันช่วยงานแบบไหน?
    • มันใช้แทนโปรแกรมอะไรได้?
    • "ระบบปฏิบัติการสำหรับ DevOps" ทำอะไร?
  • ความประทับใจแรกคือมันเหมือนอยู่กึ่งกลางระหว่าง Dockerfile กับการนิยามและประกอบซอฟต์แวร์ด้วยโค้ดจริง

    • ในฐานะคนที่ใช้ Nix เยอะ ไม่ค่อยรู้สึกว่าน่าสนใจ
  • Dagger เปลี่ยนทิศทางผลิตภัณฑ์หรือเปล่า?

    • จำได้ว่าจุดขายหลักเคยเป็นบริการ pipeline-as-code แบบแยกอิสระ
    • ตอนนี้ดูเหมือนกำลังพยายามประกอบ Docker ขึ้นมาใหม่