> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Containerisierung

> In diesem Tutorial zeigen wir Ihnen, wie Devin einen Docker-Container konfigurieren kann, um die Entwicklungsumgebung Ihres Teams zu standardisieren.

<div id="creating-a-docker-container">
  ## Erstellen eines Docker-Containers
</div>

Da Devin Zugriff auf ein Terminal hat und Software auf seinem eigenen Server konfigurieren und ausführen kann, ist das Einrichten eines Docker-Containers für ihn problemlos möglich.

Unsere Beispielanwendung ist ein Go-Projekt mit MongoDB als Datenspeicher. Diese Sitzung ist Devins Version eines Pull Requests, den ein echter Entwickler zu einem Open-Source-Projekt eingebracht hat. Verfolge die Live-Ausführung [hier](https://app.devin.ai/sessions/379eb9a40ff2433db49e51c95c7d9bc1?ts=1729908167981).

<div id="start-with-a-github-issue">
  #### Mit einem GitHub-Issue beginnen
</div>

Wir starten mit dem ursprünglichen GitHub-Issue:

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/e8a410ab96ee363911b146bcbd923da43c25b03a-1856x746.png)
</Frame>

Als Nächstes können wir einen einfachen Prompt für Devin formulieren, basierend darauf, was in diesem Issue gefordert wird. Wir weisen Devin an, das oben stehende GitHub-Issue für zusätzlichen Kontext zu lesen, geben ihm aber auch unsere eigene Zusammenfassung der vorgeschlagenen Lösung und der Ergebnisse, die Devin erzeugen soll.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/4caecf4fd393f5573536a5b6d57d7246b684d699-1312x612.png)
</Frame>

<div id="investigating-the-codebase">
  #### Untersuchung der Codebase
</div>

Devin beginnt mit einem Untersuchungsschritt, in dem es unser verlinktes GitHub-Issue liest und den eigentlichen Code sowie die Konfigurationsdateien des Projekts nach erforderlichen Abhängigkeiten [durchsucht](/de/release-notes#repo-knowledge).

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/4f146e093bd0374b5d816c5fd9f49d6a411d6c8f-1334x844.png)
</Frame>

Nachdem die Analyse abgeschlossen ist, installiert Devin Docker auf seiner lokalen Maschine und erstellt anschließend unser erstes Dockerfile, die docker-compose.yml und die .dockerignore, damit es mit dem Testen des Container-Setups beginnen kann. Außerdem konfiguriert es unsere .env-Datei, sodass die Anwendung mit dem neu konfigurierten Container-Backend ausgeführt werden kann.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/710b051e9b5f75d3b5492f554fee786e212dc129-1314x1370.png)
</Frame>

<div id="testing-the-container">
  #### Testen der Container
</div>

Devin testet anschließend jeden Container, beginnend mit unserem MongoDB-Server und danach unserer Go-Umgebung. Sobald die Container laufen, fährt Devin damit fort, die Anwendung selbst zu testen. Beim Durchsehen von Devins [Command History](/de/work-with-devin/devin-session-tools#shell-command-history) sehe ich, dass Devin unsere Swagger-API-Definition gefunden und sie im integrierten [Browser](/de/work-with-devin/devin-session-tools#interactive-browser) geladen hat, um nachzuvollziehen, wie die Backend-API funktioniert.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/3cee193ba84dcea344e4a7fd829ae39c0d602270-2720x1422.png)
</Frame>

Anschließend hat Devin eine curl-Anfrage zusammengestellt, um zu testen, dass die Backend-API läuft und Ergebnisse wie in der Design-Spezifikation vorgesehen zurückgibt.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/de15b455421e2320b5dd6023bd0d4d47aaff2e7c-1208x710.png)
</Frame>

<div id="debugging">
  #### Debugging
</div>

Da wir einen Verbindungsfehler **Connection refused** erhalten, macht sich Devin sofort ans Debuggen und Korrigieren der Docker-Konfiguration. Dies ist ein häufiges Muster, bei dem Devin Fehler im Verlauf einer Sitzung selbst korrigieren kann. Devin behebt das Konfigurationsproblem schnell, startet den Docker-Container neu und fasst die erledigte Arbeit für uns zusammen.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/ad2d884abb70c7dd74614addbe1d8e111ebf7d53-1356x2208.png)
</Frame>

Wenn wir Devins Arbeit mit dem [PR im eigentlichen Projekt](https://github.com/Ratnesh-Team/Rehabify/pull/137) vergleichen, gibt es einige bemerkenswerte Unterschiede und Verbesserungen:

* Devin richtet zusätzlich zu unserem Dockerfile eine docker-compose.yml-Datei ein. Das verschafft uns spezifischere Orchestrierungseinstellungen, etwa wie unser Netzwerk funktioniert, wie unsere Volumes konfiguriert sind und welche Dienste voneinander abhängen.
* Devin ändert den Build-Prozess von `go mod tidy` zu einer Methode, mit der wir einige der Abhängigkeiten in unserem Docker-Build cachen können.
* Devin erstellt ein statisch gelinktes Go-Binary statt eines dynamisch gelinkten, was für unseren Docker-Build schlanker sein sollte.
* Devin konfiguriert unsere CA-Zertifikate für HTTPS und ermöglicht uns die Verwendung einer .env-Datei für die Konfiguration, anstatt Umgebungsvariablen direkt zu übergeben.
* Und am deutlichsten: Devin fügt unserer Docker-Konfiguration einen MongoDB-Dienst hinzu, den der PR im Projekt nicht enthält. Dort wird davon ausgegangen, dass bereits eine separate MongoDB-Instanz des Entwicklers läuft.

<Frame>
  ![Devin](https://cdn.sanity.io/images/2mc9cv2v/production/7607ba8b57199a26812cb8f4c7129ee5a97ffcdb-1818x1206.png)
</Frame>

In 13 Minuten hat Devin erfolgreich unseren Docker-Container für das Backend dieses Projekts nach Best Practices erstellt, getestet und eine umfassende Zusammenfassung seiner Arbeit geschrieben. Probieren Sie noch heute Ihren eigenen Containerisierungs-Prompt auf Ihrer eigenen Codebase aus, indem Sie sich für ein Devin-Konto für Ihr Team [anmelden](https://cognition.com/get-started#company).
