Gestione delle Variabili di Ambiente in Docker Compose
La gestione delle variabili di ambiente è una pratica essenziale nello sviluppo software moderno, in particolare quando si utilizzano container Docker.
Utilizzare Docker Compose, per configurare dinamicamente i servizi e le risorse delle applicazioni, permette di gestire ambienti di sviluppo, test e produzione in modo flessibile ed efficiente.
In questo articolo, vedremo come creare e gestire un file .env
e come
integrarlo correttamente con il file docker-compose.yml
.
Creazione del File .env
Il file .env
è un semplice file di testo (nascosto) che contiene variabili di
ambiente definite nel formato NOMEVARIABILE=valore
. Assicurati sempre che il
file .env
non contenga spazi attorno agli =
. Queste variabili possono
essere utilizzate per configurare diversi aspetti dei servizi Docker.
Per creare un file .env
, segui i seguenti punti:
Creare il file
.env
nella radice del progetto:touch .env
Definire le variabili di ambiente nel file
.env
:DATA_BASEDIR=/percorso/del/tuo/volume HTTP_PORT=80 HTTPS_PORT=443
In questo esempio,
DATA_BASEDIR
specifica il percorso del volume, mentreHTTP_PORT
eHTTPS_PORT
definiscono le porte HTTP e HTTPS.
Utilizzo delle Variabili di Ambiente in docker-compose.yml
Una volta definite le variabili di ambiente nel file .env
, possiamo
utilizzarle nel file docker-compose.yml
con la sintassi ${NOME_VARIABILE}
.
Ecco un esempio:
services:
nome_servizio:
build: .
restart: unless-stopped
container_name: nome_servizio
network_mode: bridge
volumes:
- ${DATA_BASEDIR}:/var/data
ports:
- "${HTTP_PORT}:8080"
- "${HTTPS_PORT}:8443"
In questo file docker-compose.yml
:
- Le variabili
${DATA_BASEDIR}
,${HTTP_PORT}
, e${HTTPS_PORT}
sono utilizzate per configurare il volume e le porte del servizionome_servizio
. - Le porte sono racchiuse tra doppi apici per evitare problemi di sintassi
YAML
.
Esecuzione di Docker Compose con Variabili di Ambiente
Per eseguire Docker Compose e caricare le variabili di ambiente dal file
.env
, è sufficiente utilizzare il comando:
docker-compose --env-file .env up
Questo comando caricherà le variabili di ambiente definite nel file .env
e le
renderà disponibili per la configurazione dei servizi Docker.
Da notare che se il file delle configurazioni è denominato .env
, e si trova
allo stesso livello del file docker-compose.yml
, puoi evitare di puntare
esplicitamente il file nel comando. In questo caso, il comando può essere:
docker-compose up
Il comando precedente caricherà comunque le variabili definite in .env
.
Versionamento file .env
Quando si gestiscono file .env
, all'interno di un progetto, è importante
porre l'attenzione sul versionamento e la sicurezza dei file, poiché essi sono
ricchi di informazioni e credenziali molto importanti.
Di seguito ti mostro alcune buone pratiche per il versionamento dei file
.env
, che è opportuno seguire.
Non versionare file .env
direttamente
Il file .env
contiene informazioni sensibili quali credenziali di accesso,
chiavi API, ed altre configurazioni che non andrebbero condivise con nessuno.
Questo è il motivo per il quale, non dovresti mai versionare il file .env
direttamente nel tuo sistema di versionamento (GIT
).
Crea un file di esempio
La buona pratica, per tenere traccia delle variabili da compilare all'interno
del file .env
del tuo progetto, è quella di creare un file di esempio
.env.example
e versionare questo file. Il versionamento del file
.env.example
consente, a chiunque si approccia al progetto, di capire quali
variabili valorizzare e quindi di diventare operativo in pochissimo tempo.
Un file di esempio potrebbe essere il seguente:
BASE_BASEDIR=/percorso/del/tuo/volume
HTTP_PORT=inserire_qui_il_numero_di_porta_http
HTTPS_PORT=inserire_qui_il_numero_di_porta_https
DB_USER=il_tuo_username
DB_PASSWORD=la_tua_password
Come si evince, i dati inseriti sono tutti finti ma consentono di descrivere quali dovranno essere i valori che dovranno popolare i campi.
Aggiungi .env
al .gitignore
Considerando che creerai il tuo file .env
nel progetto, è buona pratica
aggiungere la direttiva di non versionare il file all'interno del .gitignore
,
come segue:
# .gitignore
.env
Documenta l'uso del file .env
Un'altra buona pratica è quella di documentare l'utilizzo del file .env
,
all'interno del README.md
di progetto. In questo modo comunicherai, come un
nuovo utente dovrà configurare il suo ambiente per poter cominciare a lavorare.
Stampa delle variabili di ambiente in Python
Puoi implementare il seguente codice per stampare, all'interno di uno script Python, le variabili d'ambiente ricevute da docker-compose.yml
.
Per fare ciò, in primo luogo crea un file print_env.py
, che legge e stampa le variabili d'ambiente:
import os
# Elenco delle variabili d'ambiente che vuoi stampare
env_vars = ['DB_HOST', 'DB_USER', 'DB_PASSWORD', 'HTTP_PORT', 'HTTPS_PORT']
for var in env_vars:
value = os.getenv(var)
print(f'{var}: {value}')
Successivamente, crea il file .env
, come segue:
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=mysecret
HTTP_PORT=8080
HTTPS_PORT=8443
Crea a questo punto il Dockerfile
per costruire l'immagine, come segue:
FROM python:3.9-slim
WORKDIR /app
COPY print_env.py .
CMD ["python", "print_env.py"]
Infine, crea il docker-compose.yml
, come segue:
version: '3.8'
services:
print_env:
build: .
restart: unless-stopped
network_mode: bridge
environment:
- DB_HOST=${DB_HOST}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
- HTTP_PORT=${HTTP_PORT}
- HTTPS_PORT=${HTTPS_PORT}
command: python print_env.py
Per avviare il container, eseguire il comando:
docker-compose up --build
Vantaggi della Gestione delle Variabili di Ambiente
L'utilizzo di un file .env
per definire le variabili di ambiente offre
diversi vantaggi:
- Flessibilità: È possibile cambiare rapidamente le configurazioni per
diversi ambienti (sviluppo, test, produzione) senza modificare il file
docker-compose.yml
. - Sicurezza: Le informazioni sensibili, come password e chiavi API, possono essere gestite in modo più sicuro e isolato dal codice sorgente.
- Manutenibilità: Centralizzare le configurazioni di ambiente in un unico file facilita la gestione e la manutenzione del progetto.
Conclusione
La gestione delle variabili di ambiente con Docker Compose è una pratica
potente che semplifica la configurazione e la gestione dei container Docker.
Creando un file .env
e integrandolo correttamente con il file
docker-compose.yml
, è possibile gestire le configurazioni in modo
efficiente e sicuro. Questa tecnica è fondamentale per garantire che le
applicazioni funzionino correttamente in diversi ambienti, migliorando la
produttività e la qualità del software.
Inizia subito a utilizzare le variabili di ambiente nei tuoi progetti Docker e sperimenta i benefici di una configurazione più flessibile e gestibile.