Dockerfile vs Docker Compose: chi ha la precedenza?

Immagine di copertina

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.


🔗 Leggi anche:

Conosci meglio chi ha scritto questo articolo

Serena Sensini

Ciao! Mi chiamo Serena Sensini e sono la creatrice di @ TheRedCode.it. Ho aperto questo blog nel 2021 per raccontare il mio lavoro e il mondo dell’informatica a parole semplici, in piccole pillole e alla portata di tutte le persone.

Sono un’ingegnera informatica specializzata in ambito AI & NLP. Di giorno lavoro come CTO @ Welyk e come Innovation & Emerging Technologies Leader @ Dedalus, mentre di notte scrivo e sono autrice di 5 libri -per ora-. 🖊️

Foto di Serena Sensini

Partners

Community, aziende e persone che supportano attivamente il blog

Vuoi diventare tech content creator? 🖊️

Se ti va di raccontare la tua esperienza nel mondo tech, questo è il posto giusto.

Cerchiamo voci autentiche, esempi pratici e punti di vista utili per chi legge.

Scrivici a collaborazioni[at]theredcode.it con una proposta: idea, taglio del contenuto e una breve presentazione. Non vediamo l'ora di leggere la tua esperienza!

Invia la tua idea