Was ist der Unterschied zwischen "Docker-Compose Build" und "Docker Build"?

83

Was ist der Unterschied zwischen docker-compose buildund docker build?

Angenommen, in einem Docker-Projektpfad befindet sich eine docker-compose.ymlDatei:

docker-compose build

Und

docker build
Benyamin Jafari
quelle

Antworten:

106

docker-composekann 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.ymlverwendet, um Parameter abzurufen.

Die Referenz für das Docker-Compose-Dateiformat finden Sie hier .

docker-compose buildLesen Sie also im Grunde Ihre docker-compose.yml, suchen Sie nach allen Diensten, die die build:Anweisung enthalten, und führen Sie docker buildfü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 buildmuss nur das webZiel ein Image erstellen. Der docker buildBefehl würde folgendermaßen aussehen:

docker build -t web_myproject -f Dockerfile-alpine ./web
hugoShaka
quelle
2
Woher kommt das Tag "web_myproject" oder ist es nur ein Beispiel? Können Sie beim Erstellen mit Docker-Compose überhaupt einen Bildnamen angeben?
Eyalzba
5
webkommt vom Containernamen. myprojectist der Name des Ordners, in dem Sie sich befinden. Dadurch werden Konflikte vermieden, wenn Sie an zwei Projekten arbeiten, die beide einen webContainer enthalten.
HugoShaka
Bitte werfen Sie einen Blick auf stackoverflow.com/questions/33816456/…
hugoShaka
Basierend auf den docker-compose.ymloben angegebenen, webkommt aus dem Dienstnamen.
Eigenfeld
1
Dies war auch mein Verständnis, aber es scheint, dass es einige subtile Unterschiede gibt. Beispielsweise werden Dateiebenen-Hashes zwischen den beiden geringfügig unterschiedlich berechnet.
vidstige
9

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.

Ingwer Bier
quelle
5

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
Shivbits
quelle
Wenn Sie das Unterverzeichnis als Wert von angeben build:, müssen Sie den genauen Dateinamen als angeben Dockerfile. Zum Beispiel in build: ./web.So ist die Verwendung von context:eine gute!
Eigenfeld
2

Einige zusätzliche Worte über den Unterschied zwischen docker buildund docker-compose build. Beide haben die Option, Bilder mit einem vorhandenen Bild als Ebenen-Cache zu erstellen.

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-composedie den nativen Docker-Builder verwendet (daher können von erstellte Bilder docker buildals Cache für Ebenen verwendet werden docker-compose build).

Pascal H.
quelle