403 Stimmen

Docker: Mehrere Dockerfiles im Projekt

Wie organisieren Sie die Dockerfiles eines Projekts, wenn Sie ein Dockerfile für die Datenbank, eines für den Anwendungsserver usw. haben? Erstellen Sie eine Art Hierarchie im Quellcode? Ein großes Enterprise-Projekt kann doch nicht nur aus einem Dockerfile bestehen?

472voto

Shuo Punkte 7537

In neueren Versionen (>=1.8.0) von Docker kannst du dies tun

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

Ein großer Vorteil.

EDIT: Aktualisiere die Versionen gemäß Raksjas Kommentar

EDIT: Kommentar von @vsevolod: Es ist möglich, in VS Code eine Syntaxhervorhebung zu erhalten, indem Sie den Dateien die Erweiterung .Dockerfile geben (anstelle des Namens) z. B. Prod.Dockerfile, Test.Dockerfile usw.

283voto

GabLeRoux Punkte 14712

Verwenden Sie docker-compose und mehrere Dockerfile in separaten Verzeichnissen

Benennen Sie Ihren Dockerfile nicht um in Dockerfile.db oder Dockerfile.web, da dies möglicherweise nicht von Ihrem IDE unterstützt wird und Sie die Syntaxhervorhebung verlieren.

Wie Kingsley Uchnor sagte, können Sie mehrere Dockerfile haben, eines pro Verzeichnis, das etwas darstellt, das Sie erstellen möchten.

Ich habe gerne einen docker-Ordner, der jede Anwendung und deren Konfiguration enthält. Hier ist ein Beispiel für die Projektordner-Hierarchie für eine Webanwendung mit einer Datenbank.

docker-compose.yml
docker
 web
    Dockerfile
 db
     Dockerfile

docker-compose.yml Beispiel:

version: '3'
services:
  web:
    # wird ./docker/web/Dockerfile bauen
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # wird ./docker/db/Dockerfile bauen
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # wird das vorgefertigte Redis-Image von Docker Hub verwenden:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose Befehlszeilen-Beispiel:

# Der folgende Befehl erstellt und startet alle Container im Hintergrund
# unter Verwendung von docker-compose.yml aus dem aktuellen Verzeichnis
docker-compose up -d

# Hilfe aufrufen
docker-compose --help

Falls Sie Dateien aus übergeordneten Verzeichnis(sen) als Teil des Build-Kontexts Ihres Dockerfiles benötigen

Sie können immer noch die obige Lösung verwenden und Ihr Dockerfile in einem Verzeichnis wie z.B. docker/web/Dockerfile platzieren, alles was Sie brauchen, ist den Build-Kontext in Ihrer docker-compose.yml festzulegen, wie folgt:

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

Die Dateihierarchie würde so aussehen:

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

Das ./docker/web/Dockerfile wird Zugriff auf gewünschte Dateien aus dem Kontext haben, wie folgt:

FROM alpine:latest

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

Beachten Sie auch, dass der Build-Kontext alle Dateien des angegebenen Verzeichnisses enthalten wird. Stellen Sie sicher, dass Sie eine .dockerignore-Datei verwenden, um das Laden unerwünschter großer Dateien oder Verzeichnisse während des Builds zu verhindern und Zeit zu sparen.

Hier sind einige schnelle Befehle von tldr docker-compose. Vergewissern Sie sich, dass Sie sich an die offizielle Dokumentation für weitere Details wenden.

38voto

Mark O'Connor Punkte 74233

Hinweis des Autors

Diese Antwort ist veraltet. Fig existiert nicht mehr und wurde durch Docker Compose ersetzt. Akzeptierte Antworten können nicht gelöscht werden.

Docker Compose unterstützt den Aufbau einer Projektstruktur. Es ist jetzt einfach, ein Dockerfile in jedem Unterverzeichnis zu unterstützen.

 docker-compose.yml
 project1
    Dockerfile
 project2
     Dockerfile

Ursprüngliche Antwort

Ich erstelle einfach ein Verzeichnis, das ein Dockerfile für jedes Komponente enthält. Beispiel:

Beim Erstellen der Container einfach den Verzeichnisnamen angeben und Docker wählt das richtige Dockerfile aus.

17voto

KaziMurtaza Punkte 167

In Intellij habe ich einfach den Namen der Docker-Dateien in *.Dockerfile geändert und den Dateityp *.Dockerfile der Docker-Syntax zugeordnet.

3voto

Larytet Punkte 605

Fügen Sie eine Abstraktionsschicht hinzu, zum Beispiel eine YAML-Datei wie in diesem Projekt https://github.com/larytet/dockerfile-generator, die so aussieht

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

Ein kurzes Python-Skript/Makefile kann alle Dockerdateien aus der Konfigurationsdatei generieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X