Dagger Shell - 컨테이너 시대를 위한 새로운 쉘
(dagger.io)- Unix 쉘은 50년 이상 사용되어 왔으며, 단순한 명령어로 복잡한 동작을 조합할 수 있는 강력한 컴퓨팅 도구였음
- 그러나 현대 소프트웨어 스택은 훨씬 복잡해졌고, 기존 쉘로는 이 모든 작업을 다루기 어려움
- Docker, make, powershell, nix 등에서 영감을 받아, 컨테이너, 시크릿, 서비스 엔드포인트, 선언형 실행, 캐시 및 샌드박싱 등을 기본 지원하는 현대적인 쉘이 필요해짐
- Dagger Shell은 Dagger Engine을 위한 bash 문법 기반 프론트엔드로, 빌드, 테스트, 배포, 임시 환경 등 다양한 자동화 작업에 활용 가능
- 시스템 쉘을 대체하기보다는 보완하는 도구로, 복잡한 워크플로우를 간단한 모듈 조합으로 구성할 수 있도록 도와줌
container | from alpine | with-exec apk add git | terminal
-
쉘과 코드만 있으면 충분함
- 복잡한 스크립트를 처리할 때 이상한 DSL을 배우는 대신, 실제 프로그래밍 언어로 작성 가능
- Go, Python, Typescript, Java, PHP 등 다양한 언어용 SDK 제공
- 언어로 작성한 함수를 Dagger의 새로운 프리미티브로 확장 가능
-
API와 연결된 쉘
- Dagger Shell은 Dagger API 클라이언트 역할을 하며, 타입이 지정된 객체, 문서화, 재사용 가능한 모듈 생태계(Daggerverse) 접근 가능
- 예를 들어, Trivy 보안 스캐닝 모듈을 로드하고 실행 가능
-
기본 샌드박스 환경
- 모든 명령은 기본적으로 샌드박스에서 실행되며, 파일, 시크릿, 서비스 등의 접근은 명시적으로 지정해야 함. 약간 더 장황하지만, 반복 가능성과 안전성이 높아짐
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
- 모든 명령은 기본적으로 샌드박스에서 실행되며, 파일, 시크릿, 서비스 등의 접근은 명시적으로 지정해야 함. 약간 더 장황하지만, 반복 가능성과 안전성이 높아짐
-
간단한 컨테이너 빌드
- Alpine 기반 컨테이너 생성, 텍스트 파일 삽입, 메시지 출력 설정, 임시 레지스트리에 푸시까지 한 번에 실행 가능
- Dockerfile 작성과 빌드 명령, 푸시 사이의 컨텍스트 전환 없이 처리 가능
# 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에서 자주 발생하는 문제인 테스트 환경 구성도 간단하게 처리 가능
- 네이티브 서비스 바인딩 지원으로 여러 라이브 인스턴스를 연결하고 테스트 가능
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
-
다단계 빌드(Multi-Stage Builds)
- 명확하고 모듈화된 문법으로 복잡한 빌드 파이프라인 구현 가능
- 각 단계를 변수로 명시하여 디버깅 및 재사용이 쉬움
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
Hacker News 의견
-
요즘 Dagger의 실제 용도를 파악하기가 점점 어려워지는 느낌임
- 처음에는 Jenkins를 대체할 수 있을 것이라고 기대했음
- CI 파이프라인을 로컬에서 실행하고 디버그할 수 있는 대안 제공
- Golang으로 작성하고 필요한 것을 가져올 수 있었음
- 지금은 방향이 산만해져 Docker를 대체하려고 하고, 새로운 셸이 되려 하며, 이상하게 Langchain이 되려는 것 같음
- 새로운 CLI 인자가 기존의 셸 스크립트나 Jenkinsfile보다 나을 게 없음
- 프로젝트가 원래의 목표에서 벗어난 것 같아 아쉬움
-
Dockerfile과 셸 스크립트를 조합하여 다양한 이미지를 구성하는 일이 많음
- 개발자 머신, 로봇, CI 등 환경에 따라 다르게 실행해야 함
- 이 도구가 그 복잡함을 해결할 수 있을 것 같음
- 빌드의 출력을 참조할 수 있어 태그를 다루지 않아도 되는 점이 좋음
-
Dagger가 Docker를 대체하려 한다는 사실을 놓쳤음
- 큰 비전임
- 야심찬 시도지만, 지금 당장 기존 도구를 대체할 수 있을 것이라는 믿음으로 이어지기 어려움
- Bash 호환성을 선택한 점이 아쉬움
- Bash의 문법과 문제점에서 벗어나야 할 시점이라고 생각함
-
Dagger Shell 스크립트를 노트북 형식으로 작성할 수 있는 웹 UI가 이미 만들어져 있음
- 매우 흥미로움, 확인해보길 추천함
-
Dagger의 홈페이지 설명을 보고 궁금증이 생김
- "크로스 플랫폼 구성 엔진"
- 모듈형 구성 요소와 간단한 함수로 강력한 소프트웨어 환경을 구축
- 복잡한 빌드와 AI 워크플로우에 적합
- 너무 일반적이라 쓸모없음
- 모든 것이 구성 엔진임. Javascript도, macOS도 구성 엔진임
-
관련된 자기 홍보
- Docker 셸 컨테이너: https://github.com/jrz/container-shell
-
컨테이너 내부에서 개발 작업을 하려는 목적인가?
- Jetify의 Devbox와 Flox.dev가 떠오름
-
명확히, 이 도구로 무엇을 할 수 있을까?
- 어떤 활동에 도움이 되는가?
- 어떤 프로그램을 대체할 수 있는가?
- "DevOps 운영 체제"는 무엇을 하는가?
-
초기 인상은 Dockerfile과 실제 코드로 소프트웨어를 정의하고 구성하는 것의 중간 단계 같음
- Nix를 많이 사용하는 사람으로서 매력적이지 않음
-
Dagger가 제품 방향을 바꾼 것인가?
- 독립적인 파이프라인-코드 서비스가 주요 판매 포인트였던 것으로 기억함
- 이제 Docker를 재구성하려는 것 같음