Was ist der Unterschied zwischen docker-compose build
und docker build
?
Angenommen, in einem Docker-Projektpfad befindet sich eine docker-compose.yml
Datei:
docker-compose build
Und
docker build
Was ist der Unterschied zwischen docker-compose build
und docker build
?
Angenommen, in einem Docker-Projektpfad befindet sich eine docker-compose.yml
Datei:
docker-compose build
Und
docker build
Antworten:
docker-compose
kann als Wrapper um die Docker-CLI betrachtet werden (tatsächlich handelt es sich um eine andere Implementierung in Python, wie in den Kommentaren erwähnt ), um Zeit zu gewinnen und 500 Zeichen lange Zeilen zu vermeiden (und auch mehrere Container gleichzeitig zu starten). Es wird eine aufgerufene Datei docker-compose.yml
verwendet, um Parameter abzurufen.
Die Referenz für das Docker-Compose-Dateiformat finden Sie hier .
docker-compose build
Lesen Sie also im Grunde Ihre docker-compose.yml
, suchen Sie nach allen Diensten, die die build:
Anweisung enthalten, und führen Sie docker build
für jeden einen aus.
Jederbuild:
kann a Dockerfile
, einen Kontext und Argumente angeben , die an Docker übergeben werden sollen.
Um mit einer Beispieldatei abzuschließen docker-compose.yml
:
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 Aufrufen docker-compose build
muss nur das web
Ziel ein Image erstellen. Der docker build
Befehl würde folgendermaßen aussehen:
docker build -t web_myproject -f Dockerfile-alpine ./web
web
kommt vom Containernamen. myproject
ist der Name des Ordners, in dem Sie sich befinden. Dadurch werden Konflikte vermieden, wenn Sie an zwei Projekten arbeiten, die beide einen web
Container enthalten.
docker-compose.yml
oben angegebenen, web
kommt aus dem Dienstnamen.
docker-compose build
erstellt die Dienste in der 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 Möglichkeit, Docker zu verwenden als nur ein Docker-Befehl.
Wenn die Frage hier ist, ob der Docker-Compose-Build-Befehl eine Zip-Datei mit mehreren Bildern erstellt, die sonst mit der üblichen Docker-Datei separat erstellt worden wären, dann ist das Denken falsch.
Docker-Compose Build erstellt einzelne Images, indem Sie in docker-compose.yml in den einzelnen Serviceeintrag gehen.
Mit Docker-Bildern, Befehl, können wir auch alle einzelnen Bilder sehen, die gespeichert werden.
Die wahre Magie ist Docker-Compose.
Dieser erstellt im Grunde ein Netzwerk miteinander verbundener Container, die mit einem Containernamen ähnlich einem Hostnamen miteinander kommunizieren können.
Zur ersten Antwort hinzufügen ...
Sie können den Bildnamen und den Containernamen unter der Dienstdefinition angeben.
Beispiel: Für den Dienst "web" im folgenden Docker-Compose-Beispiel können Sie den Bildnamen und den Containernamen explizit angeben, damit Docker die Standardeinstellungen nicht verwenden muss.
Andernfalls ist der vom Docker verwendete Image-Name die Verkettung des Ordners (Verzeichnisses) und des Dienstnamens. zB myprojectdir_web
Es ist daher besser, den gewünschten Bildnamen explizit anzugeben, der generiert wird, wenn der Docker-Build-Befehl ausgeführt wird.
Beispiel: mywebserviceImage container_name: my-webServiceImage-Container
Beispiel für die Datei docker-compose.yml:
version: '3.2'
services:
web:
build:
dockerfile: Dockerfile-alpine
context: ./web
ports:
- 8099:80
image: mywebserviceImage
container_name: my-webServiceImage-Container
depends_on:
- database
build:
, müssen Sie den genauen Dateinamen als angeben Dockerfile
. Zum Beispiel in build: ./web
.So ist die Verwendung von context:
eine gute!
Einige zusätzliche Worte über den Unterschied zwischen docker build
und docker-compose build
. Beide haben die Option, Bilder mit einem vorhandenen Bild als Ebenen-Cache zu erstellen.
docker build
ist die Option--cache-from <image>
docker-composer
gibt es ein Tag cache_from
im build
Abschnitt.Leider sind Bilder, die von einem erstellt wurden, auf dieser Ebene bisher nicht mit dem anderen als Ebenen-Cache kompatibel ( IDs sind nicht kompatibel ). In docker-compose
Version 1.25.0 (18.11.2019) wird jedoch eine experimentelle Funktion COMPOSE_DOCKER_CLI_BUILD eingeführt , docker-compose
die den nativen Docker-Builder verwendet (daher können von erstellte Bilder docker build
als Cache für Ebenen verwendet werden docker-compose build
).