Dockerfile vs Docker Compose: chi ha la precedenza?
Quando si lavora con Docker e Docker Compose, si può avere dei dubbi su quali configurazioni abbiano la precedenza se definite due volte: cosa succede agli utenti, cosa alle configurazioni dell’ambiente? Facile, con alcuni esempi! 😏
Variabili di ambiente
La documentazione di Docker fornisce una spiegazione dettagliata di come le variabili di ambiente abbiano la priorità o meno quando impostate sia in Docker Compose che nei Dockerfile.
L’ordine di precedenza (dal più alto al più basso) è il seguente:
- In primis, quelle impostate tramite il comando
docker compose run -e
quando si lavora da terminale. - Poi si passa al file di environment che può essere il file
.env
predefinito o con l’argomento--env-file
. - Se presenti, i valori presenti nel file YAML per Docker Compose utilizzando solo l’attributo
environment
nel file Compose. - Eventuali utilizzi dell’attributo
env_file
nel file Compose. - Infine, le variabili descritte nel Dockerfile tramite istruzione ENV.
Esempio
In questo esempio, si va a configurare una variabile che definisce che livello di dettaglio devono avere i log: nel caso del Dockerfile, il livello è settato su warn, mentre nel Docker Compose su info. La precedenza andrà a Docker Compose, seguendo le regole definite in precedenza:
FROM ubuntu:20.04
ENV LOG_LEVEL=warn
...
version: '3.8'
services:
my_service:
build: ../../draft
environment:
- LOG_LEVEL=info
Gestione degli utenti
Quando si definisce un utente sia in un Dockerfile che in un file YAML Docker Compose, l’utente specificato nel file Docker Compose ha la precedenza all’avvio del container.
Esempio
In un Dockerfile
, puoi specificare un utente utilizzando l’istruzione USER. Ciò imposta l’utente predefinito per tutte le istruzioni successive nel Dockerfile e per il container quando viene eseguito. Ad esempio:
FROM ubuntu:20.04
USER appuser
In un file docker-compose.yml
, puoi anche definire un utente per il servizio utilizzando la chiave utente. Ciò sovrascrive qualsiasi utente definito nel Dockerfile quando il container viene avviato tramite Docker Compose. Ad esempio:
version: '3'
services:
myservice:
image: myimage
user: anotheruser
L’utente definito nel file docker-compose.yml
avrà la precedenza su quello definito nel Dockerfile
. Ciò significa che quando esegui la tua applicazione tramite Docker Compose, avvierà il container con un altro utente, indipendentemente da quanto specificato nel Dockerfile.
Questo comportamento consente flessibilità nella configurazione dei container, in particolare quando diversi ambienti (sviluppo, test, produzione) potrebbero richiedere utenti diversi per motivi di sicurezza od operativi.