Docker: più file Docker nel progetto


217

Come si organizzano i file Dockerfile appartenenti a un progetto quando si dispone di un file Dockerfile per il database, uno per il server delle applicazioni e così via? Crei una sorta di gerarchia nella fonte? Un progetto di grande impresa non può consistere in un solo Dockerfile?


16
potresti voler cambiare la risposta accettata
pomber

3
Dovrebbe esserci un'opzione per "votare" e spostare automaticamente un attributo "Accettato" obsoleto su una risposta più appropriata. Il criterio di ammissibilità per una tale mossa potrebbe essere 1) una grande differenza nei voti di 10, 1 E 2), l'autore della domanda non ha effettuato l'accesso per dire, un anno o più (sembra che @LuckyLuke si sia ritirato da SO 4 anni fa ...)
mirekphd,

Risposte:


6

Nota dell'autore

Questa risposta non è aggiornata. Fig non esiste più ed è stato sostituito da Docker compose . Le risposte accettate non possono essere eliminate ....

Docker Compose supporta la costruzione di gerarchie di progetti. Quindi ora è facile supportare un file Docker in ogni sottodirectory.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

Risposta originale

Creo solo una directory contenente un file Docker per ciascun componente. Esempio:

Quando si creano i contenitori, basta fornire il nome della directory e Docker selezionerà il Dockerfile corretto.


3
@DuncanJones Perché non è possibile eliminare una risposta accettata ... Provato :-)
Mark O'Connor,

287

Nelle versioni più recenti (> = 1.8.0) della finestra mobile , è possibile farlo

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

Un grande risparmio.

EDIT: aggiorna le versioni per il commento di raksja

EDIT: commento da @vsevolod: è possibile ottenere l'evidenziazione della sintassi nel codice VS fornendo file. Estensione del file di backup (anziché nome) ad esempio Prod.Dockerfile, Test.Dockerfile ecc.


2
quale versione più recente?
raksja,

4
Appena controllato, github.com/docker/docker/wiki , quindi è> Docker 1.8.0
raksja

3
sicuramente funziona, ma il mio IDE non farà alcun evidenziazione della sintassi, perché non riconosce il nome del file :(
Alexander Mills,

3
@AlexanderMills il mio IDE WebStorm non consente nemmeno Dockerfile.webcome configurazione di esecuzione. Quindi ho creato un problema: youtrack.jetbrains.com/issue/WEB-28185
steampowered

5
Come si specifica quale Dockerfile deve essere utilizzato per ogni "servizio" definito all'interno di un docker-compose.ymlfile, ad esempio?
JoeTidee,

128

Utilizzare docker-composee multipli Dockerfilein directory separate

Non rinominare il tuoDockerfile per Dockerfile.dbo Dockerfile.web, potrebbe non essere supportato dalla IDE e si perde l'evidenziazione della sintassi.

Come ha detto Kingsley Uchnor , puoi avere più Dockerfile, uno per directory, che rappresentano qualcosa che vuoi costruire.

Mi piace avere una dockercartella che contiene ogni applicazione e la loro configurazione. Ecco una gerarchia di cartelle di progetti di esempio per un'applicazione Web che ha un database.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml esempio:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose esempio di utilizzo da riga di comando:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Nel caso in cui siano necessari file da cartelle precedenti durante la creazione del Dockerfile

Puoi ancora usare la soluzione sopra e posizionare il tuo Dockerfilein una directory come docker/web/Dockerfile, tutto ciò che serve è impostare la build contextnel tuo in docker-compose.ymlquesto modo:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

In questo modo, sarai in grado di avere cose come questa:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

e ./docker/web/Dockerfilecosì:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

Ecco alcuni comandi rapidi di tldr docker-compose . Assicurati di fare riferimento alla documentazione ufficiale per maggiori dettagli.


1
Cosa succede se è necessario copiare un file del gestore pacchetti per installare i deps sul tempo di compilazione (fi COPY ../package.json /app/package.json)? Quel file sarà generalmente a livello di root e la finestra mobile ha vietato l'accesso al genitore. Quale approccio seguirai?
nass600,

1
Ho colpito anche questa limitazione e, per questa eccezione, ho creato il webprogetto da . (in docker-compose.yml:) build: .. In questo modo, webha accesso ai file root durante la creazione. Ho visto questa domanda correlata: stackoverflow.com/questions/24537340/… e possiamo invece creare dalla directory padre quando si utilizza la dockerriga di comando e questa risposta mostra come farlo con docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux,

1
Questo è un problema con il tuo IDE, non con la finestra mobile. @Shuo ha la risposta corretta.
BentOnCoding

1
La seconda risposta ha 1 anno, ma non è presa direttamente dalla documentazione di Docker. -fl'opzione va bene, ma preferisco usare docker-composecon le sottocartelle. Penso che entrambe le risposte siano valide. Molte persone preferiscono semplicemente mantenere il Dockerfilenome predefinito per supportare la maggior parte degli IDE fuori dalla scatola. Non sto invalidando la prima risposta, sto solo fornendo un'alternativa. Semplicemente non mi piace il mio IDE pensare che il mio Dockerfile sia un phpfile quando lo uso Dockerfile.php, ma sì, funziona. Ho visto alcuni esempi nella documentazione della finestra mobile; Dockerfile.build, Dockerfile.debugecc.
GabLeRoux

3
La denominazione example.Dockerfilecontinua a evidenziare la sintassi e le icone su VSCode.
vmassuchetto,

8

In Intellij, ho semplicemente cambiato il nome dei file docker in * .Dockerfile e associato il tipo di file * .Dockerfile alla sintassi docker.


1
Ho provato questo e ho una bella icona Docker.
Drumbeg,

3

Aggiungi un livello di astrazione, ad esempio un file YAML come in questo progetto https://github.com/larytet/dockerfile-generator che assomiglia

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

Un breve script / make di Python può generare tutti i Dockerfile dal file di configurazione.


1

Quando si lavora su un progetto che richiede l'uso di più file docker, è sufficiente creare ciascun file docker in una directory separata. Per esempio,

app / db /

Ognuna delle directory precedenti conterrà il proprio file docker. Quando viene creata un'applicazione, la finestra mobile cercherà tutte le directory e creerà tutti i file docker.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.