Docker: Mehrere Docker-Dateien im Projekt

214

Wie organisieren Sie die Docker-Dateien, die zu einem Projekt gehören, wenn Sie eine Docker-Datei für die Datenbank, eine für den Anwendungsserver usw. haben? Erstellen Sie eine Art Hierarchie in der Quelle? Ein großes Unternehmensprojekt kann nicht nur aus einer Docker-Datei bestehen?

Lucky Luke
quelle
15
Vielleicht möchten Sie die akzeptierte Antwort ändern
pomber
3
Es sollte eine Option geben, um ein veraltetes Attribut "Akzeptiert" automatisch zu "überstimmen" und zu einer angemesseneren Antwort zu verschieben. Das Zulassungskriterium für einen solchen Schritt könnte sein: 1) ein großer Unterschied in den Stimmen von beispielsweise 10: 1 UND 2) der Autor der Frage hat sich beispielsweise ein Jahr oder länger nicht angemeldet (anscheinend hat sich @LuckyLuke von SO 4 Jahren zurückgezogen vor ...)
mirekphd

Antworten:

6

Anmerkung des Autors

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

Docker Compose unterstützt das Erstellen von Projekthierarchien. So ist es jetzt einfach, eine Docker-Datei in jedem Unterverzeichnis zu unterstützen.

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

Ursprüngliche Antwort

Ich erstelle einfach ein Verzeichnis mit einer Docker-Datei für jede Komponente. Beispiel:

Geben Sie beim Erstellen der Container nur den Verzeichnisnamen an, und Docker wählt die richtige Docker-Datei aus.

Mark O'Connor
quelle
3
@ DuncanJones Weil Sie eine akzeptierte Antwort nicht löschen können ... Versucht :-)
Mark O'Connor
285

In neueren Versionen (> = 1.8.0) von Docker können Sie dies tun

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

Eine große Ersparnis.

BEARBEITEN: Aktualisiere Versionen gemäß Raksjas Kommentar

BEARBEITEN: Kommentar von @vsevolod: Es ist möglich, Syntaxhervorhebungen in VS-Code zu erhalten, indem Dateien mit der Erweiterung .Dockerfile (anstelle des Namens) angegeben werden, z. B. Prod.Dockerfile, Test.Dockerfile usw.

Shuo
quelle
2
welche neuere Version?
Raksja
4
Gerade überprüft, github.com/docker/docker/wiki , so ist es> Docker 1.8.0
Raksja
3
Sicher, das funktioniert, aber meine IDE macht keine Syntaxhervorhebung, da sie den Dateinamen nicht erkennt :(
Alexander Mills
3
@AlexanderMills mein IDE WebStorm erlaubt nicht einmal Dockerfile.webeine Ausführungskonfiguration. Also habe ich ein Problem erstellt: youtrack.jetbrains.com/issue/WEB-28185
Steampowered
5
Wie legen Sie fest, welche Docker- docker-compose.ymlDatei beispielsweise für jeden in einer Datei definierten "Dienst" verwendet werden soll ?
JoeTidee
127

Verwenden Sie docker-composeund mehrere Dockerfilein separaten Verzeichnissen

Benennen Sie Ihr nichtDockerfile in Dockerfile.dboder um Dockerfile.web, es wird möglicherweise nicht von Ihrer IDE unterstützt und Sie verlieren die Syntaxhervorhebung.

Wie Kingsley Uchnor sagte , können Sie mehrere Dockerfilepro Verzeichnis haben, die etwas darstellen, das Sie erstellen möchten.

Ich möchte einen dockerOrdner haben, der jede Anwendung und ihre Konfiguration enthält. Hier ist ein Beispiel für eine Projektordnerhierarchie für eine Webanwendung mit einer Datenbank.

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

docker-compose.yml Beispiel:

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 Beispiel für die Verwendung der Befehlszeile:

# 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

Falls Sie beim Erstellen Ihrer Docker-Datei Dateien aus früheren Ordnern benötigen

Sie können immer noch die obige Lösung verwenden und platzieren Sie Ihre Dockerfilein einem Verzeichnis wie docker/web/Dockerfilealles, was Sie brauchen , ist die Build setzen contextin Ihrem docker-compose.ymlwie folgt aus :

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

Auf diese Weise können Sie Folgendes tun:

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

und so ./docker/web/Dockerfileähnlich:

FROM alpine:latest

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

Hier sind einige schnelle Befehle von tldr docker-compose . Weitere Informationen finden Sie in der offiziellen Dokumentation .

GabLeRoux
quelle
1
Was ist, wenn Sie eine Paketmanagerdatei kopieren müssen, um Abhängigkeiten von der Erstellungszeit (fi COPY ../package.json /app/package.json) zu installieren ? Diese Datei befindet sich normalerweise auf Stammebene und Docker hat den Zugriff auf das übergeordnete Element verboten. Welchen Ansatz werden Sie verfolgen?
nass600
1
Ich habe diese Einschränkung ebenfalls getroffen und für diese Ausnahme baue ich das webProjekt aus . (in docker-compose.yml:) build: .. Auf diese Weise kann beim webErstellen auf Root-Dateien zugegriffen werden. Ich habe diese verwandte Frage gesehen: stackoverflow.com/questions/24537340/… und wir können stattdessen aus dem übergeordneten Verzeichnis erstellen, wenn wir die dockerBefehlszeile verwenden. Diese Antwort zeigt, wie dies mit docker-compose gemacht wird: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
Dies ist ein Problem mit Ihrer IDE, nicht mit Docker. @Shuo hat die richtige Antwort.
BentOnCoding
1
Die zweite Antwort ist 1 Jahr alt, stammt jedoch nicht direkt aus der Docker-Dokumentation. -fOption ist in Ordnung, aber ich bevorzuge die Verwendung docker-composemit Unterordnern. Ich denke, beide Antworten sind gültig. Die meisten Leute ziehen es möglicherweise vor, den Standardnamen Dockerfilebeizubehalten, um die meisten IDEs sofort zu unterstützen. Ich mache die erste Antwort nicht ungültig, ich biete nur eine Alternative. Ich mag es einfach nicht, phpwenn meine IDE denkt, dass meine Docker- Datei eine Datei ist, wenn ich sie benutze Dockerfile.php, aber ja, sie funktioniert. Ich habe einige Beispiele in der Docker-Dokumentation gesehen. Dockerfile.build, Dockerfile.debugEtc.
GabLeRoux
3
Durch die Benennung als werden example.Dockerfiledie Syntaxhervorhebungen und Symbole in VSCode beibehalten.
Vmassuchetto
8

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

KaziMurtaza
quelle
1
Versuchte dies und ich bekomme ein schönes Docker-Symbol.
Drumbeg
3

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

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

Ein kurzes Python-Skript / make kann alle Docker-Dateien aus der Konfigurationsdatei generieren.

Larytet
quelle
1

Wenn Sie an einem Projekt arbeiten, für das mehrere Docker-Dateien verwendet werden müssen, erstellen Sie einfach jede Docker-Datei in einem separaten Verzeichnis. Zum Beispiel,

app / db /

Jedes der oben genannten Verzeichnisse enthält seine Docker-Datei. Wenn eine Anwendung erstellt wird, durchsucht Docker alle Verzeichnisse und erstellt alle Docker-Dateien.

Kingsley Uchnor
quelle