Was ist der Unterschied zwischen docker-compose build
und docker build
?
Angenommen, in einem dockerisierten Projektpfad gibt es ein docker-compose.yml
Datei:
docker-compose build
Und
docker build
docker-compose
ist ein Wrapper um die Docker-CLI, um Zeit zu sparen und 500 Zeichen lange Zeilen zu vermeiden (und auch mehrere Container gleichzeitig zu starten). Es verwendet eine Datei namens docker-compose.yml
, um Parameter abzurufen.
Sie finden die Referenz für das Docker-Compose-Dateiformat hier .
Also im Grunde genommen docker-compose build
liest dein docker-compose.yml
, suche nach allen Diensten, die den build:
Anweisung und führe ein docker build
für jeden.
Jeder build:
kann ein Dockerfile
, einen Kontext und Argumente angeben, die an docker übergeben werden sollen.
Zum Abschluss ein Beispiel docker-compose.yml
Datei :
version: '3.2'
services:
database:
image: mariadb
restart: always
volumes:
- ./.data/sql:/var/lib/mysql
web:
build:
dockerfile: Dockerfile-Alpine
context: ./web
ports:
- 8099:80
depends_on:
- database
Beim Aufruf von docker-compose build
, nur das web
-Ziel benötigt ein Image, um erstellt zu werden. Das docker build
Befehl würde so aussehen:
docker build -t web_myproject -f Dockerfile-Alpine ./web
docker-compose build
erstellt die Dienste in docker-compose.yml
Datei.
https://docs.docker.com/compose/reference/build/
docker build
erstellt das von Dockerfile definierte Image.
Grundsätzlich ist Docker-Compose eine bessere Methode, Docker zu verwenden, als nur einen Docker-Befehl.
Wenn die Frage hier lautet, ob der Befehl docker-compose build eine Zip-Datei erstellt, die mehrere Images enthält, die andernfalls mit der üblichen Docker-Datei separat erstellt worden wären, ist die Überlegung falsch.
Docker-compose build erstellt einzelne Images, indem in docker-compose.yml ein Eintrag für einzelne Services eingegeben wird.
Mit dem Befehl docker images können wir auch sehen, wie alle Einzelbilder gespeichert werden.
Die wahre Magie besteht darin, dass sich die Hafenarbeiter zusammensetzen.
Dieser wird im Grunde genommen ein Netzwerk von miteinander verbundenen Containern erstellen, die miteinander mit einem Containernamen kommunizieren können, der einem Hostnamen ähnelt.
Zur ersten Antwort hinzufügen ...
Sie können den Image-Namen und den Containernamen unter der Service-Definition angeben.
z.B. Für den Dienst "web" im folgenden Docker-Compose-Beispiel können Sie den Image-Namen und den Containernamen explizit angeben, damit Docker die Standardeinstellungen nicht verwenden muss.
Andernfalls besteht der von Docker verwendete Bildname aus der Verknüpfung des Ordners (Verzeichnis) und des Dienstnamens. z.B. myprojectdir_web
Aus diesem Grund ist es besser, den gewünschten Image-Namen explizit anzugeben, der generiert wird, wenn der Docker-Build-Befehl ausgeführt wird.
z.B. image: mywebserviceImage container_name: my-webServiceImage-Container
beispiel für eine docker-compose.yml-Datei:
version: '3.2'
services:
web:
build:
dockerfile: Dockerfile-Alpine
context: ./web
ports:
- 8099:80
image: mywebserviceImage
container_name: my-webServiceImage-Container
depends_on:
- database