2 Punkte von GN⁺ 2025-04-02 | 2 Kommentare | Auf WhatsApp teilen
  • Unix-Shells werden seit mehr als 50 Jahren verwendet und waren leistungsstarke Computing-Werkzeuge, mit denen sich komplexe Abläufe aus einfachen Befehlen zusammensetzen lassen
    • Die moderne Software-Stack ist jedoch deutlich komplexer geworden, und mit herkömmlichen Shells ist es schwierig, all diese Aufgaben abzudecken
    • Inspiriert von Docker, make, PowerShell, Nix und anderen wird eine moderne Shell benötigt, die Container, Secrets, Service-Endpunkte, deklarative Ausführung, Caching und Sandboxing nativ unterstützt
  • Dagger Shell ist ein auf Bash-Syntax basierendes Frontend für die Dagger Engine und kann für verschiedene Automatisierungsaufgaben wie Build, Test, Deployment und temporäre Umgebungen genutzt werden
  • Statt die System-Shell zu ersetzen, ist sie als ergänzendes Werkzeug gedacht, das hilft, komplexe Workflows aus einfachen Modulkombinationen zusammenzusetzen
    container |  
      from alpine |  
      with-exec apk add git |  
      terminal  
    
  • Mit Shell und Code allein reicht es aus

    • Statt beim Umgang mit komplexen Skripten eine seltsame DSL zu lernen, kann man in echten Programmiersprachen schreiben
    • SDKs für verschiedene Sprachen wie Go, Python, Typescript, Java und PHP werden bereitgestellt
    • In einer Sprache geschriebene Funktionen lassen sich zu neuen Primitiven von Dagger erweitern
  • Eine mit der API verbundene Shell

    • Dagger Shell fungiert als Dagger-API-Client und bietet Zugriff auf typisierte Objekte, Dokumentation und ein wiederverwendbares Modul-Ökosystem (Daggerverse)
    • So lässt sich zum Beispiel das Sicherheits-Scanning-Modul Trivy laden und ausführen
  • Standardmäßig eine Sandbox-Umgebung

    • Alle Befehle werden standardmäßig in einer Sandbox ausgeführt, und der Zugriff auf Dateien, Secrets, Services usw. muss explizit angegeben werden. Das ist etwas ausführlicher, erhöht aber Reproduzierbarkeit und Sicherheit
      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  
      
  • Einfaches Container-Building

    • Ein auf Alpine basierender Container kann erzeugt, eine Textdatei eingefügt, eine Ausgabenachricht gesetzt und anschließend in eine temporäre Registry gepusht werden – alles in einem Durchlauf
    • Das funktioniert ohne Kontextwechsel zwischen dem Schreiben eines Dockerfiles, Build-Befehlen und dem Push-Vorgang
      # 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  
      
  • Aufbau von Testumgebungen

    • Auch der Aufbau von Testumgebungen, ein häufiges Problem in CI, lässt sich einfach handhaben
    • Dank nativer Unterstützung für Service-Bindings können mehrere laufende Instanzen verbunden und getestet werden
      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  
      
  • Mehrstufige Builds (Multi-Stage Builds)

    • Komplexe Build-Pipelines lassen sich mit klarer und modularer Syntax umsetzen
    • Jede Phase wird explizit als Variable benannt, was Debugging und Wiederverwendung erleichtert
      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 Kommentare

 
winterjung 2025-04-02

Zur Information: Der Link wurde in die Adresse https://dagger.io/blog/… geändert.

 
GN⁺ 2025-04-02
Hacker-News-Kommentare
  • In letzter Zeit wird es immer schwieriger zu verstehen, wofür Dagger eigentlich gedacht ist

    • Anfangs hatte ich erwartet, dass es Jenkins ersetzen könnte
    • Es bot eine Alternative, mit der man CI-Pipelines lokal ausführen und debuggen konnte
    • Es war in Golang geschrieben und man konnte sich holen, was man brauchte
    • Jetzt wirkt die Richtung zerfasert: Es will Docker ersetzen, eine neue Shell werden und irgendwie auch noch Langchain sein
    • Die neuen CLI-Argumente sind nicht besser als bestehende Shell-Skripte oder Jenkinsfiles
    • Schade, dass sich das Projekt offenbar von seinem ursprünglichen Ziel entfernt hat
  • Ich kombiniere oft Dockerfiles und Shell-Skripte, um verschiedene Images zu bauen

    • Je nach Umgebung wie Entwicklerrechner, Robotern oder CI muss es unterschiedlich laufen
    • Dieses Tool scheint diese Komplexität lösen zu können
    • Gut ist, dass man auf die Build-Ausgaben verweisen kann und sich nicht mit Tags beschäftigen muss
  • Mir war entgangen, dass Dagger Docker ersetzen will

    • Das ist eine große Vision
    • Ein ambitionierter Versuch, aber schwer zu glauben, dass es bestehende Tools schon jetzt ersetzen kann
    • Schade, dass man sich für Bash-Kompatibilität entschieden hat
    • Ich finde, es ist an der Zeit, Bash-Syntax und ihre Probleme hinter uns zu lassen
  • Es gibt bereits eine Web-UI, mit der man Dagger-Shell-Skripte im Notebook-Format schreiben kann

    • Sehr interessant, unbedingt ansehen
  • Beim Lesen der Beschreibung auf der Dagger-Website kamen bei mir Fragen auf

    • "Cross-Platform-Konfigurations-Engine"
    • Mit modularen Komponenten und einfachen Funktionen leistungsfähige Software-Umgebungen aufbauen
    • Geeignet für komplexe Builds und AI-Workflows
    • Viel zu allgemein und damit nutzlos
    • Alles ist eine Konfigurations-Engine. Javascript ist eine Konfigurations-Engine, macOS auch
  • Verwandte Eigenwerbung

  • Geht es darum, Entwicklungsarbeit innerhalb von Containern zu erledigen?

    • Das erinnert mich an Devbox von Jetify und Flox.dev
  • Ganz konkret: Was kann man mit diesem Tool tun?

    • Wobei hilft es?
    • Welche Programme kann es ersetzen?
    • Was macht ein "DevOps-Betriebssystem"?
  • Mein erster Eindruck ist, dass es zwischen Dockerfiles und dem Definieren bzw. Konfigurieren von Software mit echtem Code liegt

    • Als jemand, der viel Nix nutzt, finde ich das nicht besonders attraktiv
  • Hat Dagger seine Produktrichtung geändert?

    • Soweit ich mich erinnere, war ein eigenständiger Pipeline-as-Code-Service das wichtigste Verkaufsargument
    • Jetzt scheint es eher Docker neu aufbauen zu wollen