- 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