Docker: plusieurs Dockerfiles dans le projet

218

Comment organisez-vous les Dockerfiles appartenant à un projet lorsque vous avez un Dockerfile pour la base de données, un pour le serveur d'applications, etc.? Créez-vous une sorte de hiérarchie dans la source? Un grand projet d'entreprise ne peut pas se composer d'un seul Dockerfile?

Lucky Luke
la source
16
vous voudrez peut-être changer la réponse acceptée
bombardier
3
Il devrait y avoir une option pour «voter» et déplacer automatiquement un attribut obsolète «Accepté» vers une réponse plus appropriée. Le critère d'éligibilité pour un tel déménagement pourrait être 1) une grande différence de votes, par exemple 10: 1 ET 2) l'auteur de la question ne s'est pas connecté pendant un an ou plus (il semble que @LuckyLuke ait pris sa retraite de SO 4 ans il y a ...)
mirekphd

Réponses:

6

Note de l'auteur

Cette réponse est obsolète. La figure n'existe plus et a été remplacée par Docker compose . Les réponses acceptées ne peuvent pas être supprimées ....

Docker Compose prend en charge la création d'une hiérarchie de projet. Il est donc désormais facile de prendre en charge un Dockerfile dans chaque sous-répertoire.

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

Réponse originale

Je viens de créer un répertoire contenant un Dockerfile pour chaque composant. Exemple:

Lors de la construction des conteneurs, donnez simplement le nom du répertoire et Docker sélectionnera le fichier Docker correct.

Mark O'Connor
la source
3
@DuncanJones Parce que vous ne pouvez pas supprimer une réponse acceptée ... Essayé :-)
Mark O'Connor
287

Dans les versions plus récentes (> = 1.8.0) de docker , vous pouvez le faire

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

Une grosse économie.

EDIT: mise à jour des versions par commentaire de raksja

EDIT: commentaire de @vsevolod: il est possible d'obtenir la coloration syntaxique dans le code VS en donnant des fichiers .Dockerfile extension (au lieu du nom) par exemple Prod.Dockerfile, Test.Dockerfile etc.

Shuo
la source
2
quelle nouvelle version?
raksja
4
Juste vérifié, github.com/docker/docker/wiki , donc son> Docker 1.8.0
raksja
3
Bien sûr, cela fonctionne, mais mon IDE ne fera aucune mise en évidence de la syntaxe, car il ne reconnaît pas le nom de fichier :(
Alexander Mills
3
@AlexanderMills mon IDE WebStorm ne permet même pas Dockerfile.webune configuration d'exécution. J'ai donc créé un problème: youtrack.jetbrains.com/issue/WEB-28185
steampowered
5
Comment spécifiez-vous quel Dockerfile doit être utilisé pour chaque «service» défini dans un docker-compose.ymlfichier, par exemple?
JoeTidee
129

Utiliser docker-composeet multiple Dockerfiledans des répertoires séparés

Ne renommez pas votreDockerfile en Dockerfile.dbou Dockerfile.web, il peut ne pas être pris en charge par votre IDE et vous perdrez la coloration syntaxique.

Comme l'a dit Kingsley Uchnor , vous pouvez en avoir plusieurs Dockerfile, un par répertoire, qui représentent quelque chose que vous voulez construire.

J'aime avoir un dockerdossier qui contient chaque application et sa configuration. Voici un exemple de hiérarchie de dossiers de projet pour une application Web qui possède une base de données.

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

docker-compose.yml exemple:

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 exemple d'utilisation de la ligne de commande:

# 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

Si vous avez besoin de fichiers des dossiers précédents lors de la création de votre Dockerfile

Vous pouvez toujours utiliser la solution ci-dessus et placer votre Dockerfiledans un répertoire tel que docker/web/Dockerfile, tout ce dont vous avez besoin est de définir la construction contextdans votre docker-compose.ymlcomme ceci:

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

De cette façon, vous pourrez avoir des choses comme ça:

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

et un ./docker/web/Dockerfilecomme ça:

FROM alpine:latest

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

Voici quelques commandes rapides de tldr docker-compose . Assurez-vous de vous référer à la documentation officielle pour plus de détails.

GabLeRoux
la source
1
Que se passe-t-il si vous devez copier un fichier de gestionnaire de paquets afin d'installer des dépôts sur le temps de construction (fi COPY ../package.json /app/package.json)? Ce fichier sera généralement au niveau racine et docker a interdit l'accès au parent. Quelle approche allez-vous suivre?
nass600
1
J'ai également atteint cette limitation et pour cette exception, je crée le webprojet à partir de . (dans docker-compose.yml:) build: .. De cette façon, weba accès aux fichiers racine lors de la construction. J'ai vu cette question connexe: stackoverflow.com/questions/24537340/… et nous pouvons construire à partir du répertoire parent à la place lors de l'utilisation de la dockerligne de commande et cette réponse montre comment le faire avec docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
C'est un problème avec votre IDE, pas avec Docker. @Shuo a la bonne réponse.
BentOnCoding
1
La deuxième réponse a 1 an mais elle n'est pas directement prise en compte dans la documentation de Docker. -fl'option est très bien, mais je préfère utiliser docker-composeavec des sous-dossiers. Je pense que les deux réponses sont valables. La plupart des gens préfèrent simplement conserver le Dockerfilenom par défaut pour prendre en charge la plupart des IDE prêts à l'emploi. Je n'invalide pas la première réponse, je fournis simplement une alternative. Je n'aime tout simplement pas mon IDE penser que mon Dockerfile est un phpfichier lorsque j'utilise Dockerfile.php, mais oui, cela fonctionne. J'ai vu quelques exemples dans la documentation de docker; Dockerfile.build, Dockerfile.debug, Etc.
GabLeRoux
3
Nommer comme example.Dockerfileconserve la coloration syntaxique et les icônes sur VSCode.
vmassuchetto
8

Dans Intellij, j'ai simplement changé le nom des fichiers Docker en * .Dockerfile, et associé le type de fichier * .Dockerfile à la syntaxe Docker.

KaziMurtaza
la source
1
J'ai essayé et j'ai une belle icône Docker.
Drumbeg
3

Ajoutez une couche d'abstraction, par exemple, un fichier YAML comme dans ce projet https://github.com/larytet/dockerfile-generator qui ressemble à

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

Un court script / make Python peut générer tous les Dockerfiles à partir du fichier de configuration.

Larytet
la source
1

Lorsque vous travaillez sur un projet qui nécessite l'utilisation de plusieurs Dockerfiles, créez simplement chaque Dockerfile dans un répertoire séparé. Par exemple,

app / db /

Chacun des répertoires ci-dessus contiendra leur dockerfile. Lorsqu'une application est en cours de construction, docker recherche tous les répertoires et crée tous les fichiers docker.

Kingsley Uchnor
la source