> ## 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.

# Containerizzazione

> In questo tutorial ti mostreremo in che modo Devin può configurare un container Docker per standardizzare l'ambiente di sviluppo del tuo team.

<div id="creating-a-docker-container">
  ## Creare un container Docker
</div>

Poiché Devin ha accesso a un terminale e può configurare ed eseguire software sul proprio server, creare un container Docker rientra pienamente nelle sue capacità.

La nostra applicazione di esempio è un progetto Go con MongoDB come database. Questa sessione è la versione, realizzata da Devin, di una pull request che uno sviluppatore reale ha aperto per un progetto open source. Segui l’esecuzione in tempo reale [qui](https://app.devin.ai/sessions/379eb9a40ff2433db49e51c95c7d9bc1?ts=1729908167981).

<div id="start-with-a-github-issue">
  #### Iniziare da una GitHub Issue
</div>

Partiamo dall'issue originale su GitHub:

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

Successivamente, possiamo scrivere un semplice prompt per Devin basato su ciò che questa issue richiede. Gli chiediamo di leggere l'issue GitHub qui sopra per ulteriore contesto e gli forniamo anche un nostro riepilogo della soluzione proposta e di ciò che vogliamo che Devin produca.

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

<div id="investigating-the-codebase">
  #### Analisi della codebase
</div>

Devin inizia con una fase di analisi in cui legge la nostra issue GitHub collegata e [scansiona](/it/release-notes#repo-knowledge) il codice e i file di configurazione reali del progetto per individuare le dipendenze necessarie.

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

Al termine dell'analisi, Devin procede a installare Docker sulla propria macchina locale e quindi a creare il nostro Dockerfile iniziale, docker-compose.yml e .dockerignore, in modo da poter iniziare a testare la configurazione del container. Configura anche il nostro file .env in modo che l'applicazione possa essere eseguita utilizzando il backend del container appena configurato.

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

<div id="testing-the-container">
  #### Test del container
</div>

Devin passa quindi a testare ogni container, iniziando dal nostro server MongoDB e poi proseguendo con il nostro ambiente Go. Una volta che i container sono attivi e funzionanti, Devin passa a testare l’applicazione vera e propria. Dando un’occhiata alla [cronologia dei comandi](/it/work-with-devin/devin-session-tools#shell-command-history) di Devin posso vedere che ha trovato la nostra definizione Swagger dell’API e l’ha caricata nel [Browser](/it/work-with-devin/devin-session-tools#interactive-browser) integrato per vedere come funziona l’API di backend.

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

Devin ha poi preparato una richiesta curl per verificare che l’API di backend sia in esecuzione e restituisca risultati conformi alle specifiche di progettazione.

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

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

Poiché riceviamo un errore **Connection refused**, Devin passa immediatamente al debugging e alla correzione della configurazione Docker. Questo è uno schema ricorrente in cui Devin può autocorreggere gli errori man mano che procede in una sessione. Devin corregge rapidamente il problema di configurazione, riavvia il container Docker e riepiloga il lavoro completato per noi.

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

Quando confrontiamo il lavoro di Devin con la [PR sul progetto reale](https://github.com/Ratnesh-Team/Rehabify/pull/137), emergono alcune differenze e miglioramenti significativi:

* Devin configura un file docker-compose.yml in aggiunta al nostro Dockerfile. Questo ci fornisce impostazioni di orchestrazione più specifiche, come la definizione della nostra rete, la configurazione dei volumi e le dipendenze tra i vari servizi.
* Devin modifica il processo di build da `go mod tidy` a un metodo che consente di mettere in cache alcune dipendenze nella nostra build Docker.
* Devin crea un binario Go staticamente linkato anziché dinamicamente collegato, il che dovrebbe rendere la nostra build Docker più leggera.
* Devin configura i certificati CA per HTTPS e ci consente di usare un file .env per la configurazione anziché passare direttamente le variabili d'ambiente.
* E soprattutto, Devin aggiunge un servizio MongoDB nella nostra configurazione Docker, che nella PR del progetto non è presente. Questa infatti presume che lo sviluppatore abbia già un'istanza MongoDB separata in esecuzione.

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

In 13 minuti, Devin ha creato con successo il nostro container Docker per il backend di questo progetto seguendo le best practice, lo ha testato e ha scritto un riepilogo completo del lavoro svolto. Prova oggi stesso un prompt di containerizzazione sulla tua codebase registrandoti a un account Devin per il tuo team tramite il [sito di iscrizione](https://cognition.com/get-started#company).
