`docker-composebuild`と` docker build`の違いは何ですか?


回答:


106

docker-compose時間を稼ぎ、500文字の長さの行を回避する(そして同時に複数のコンテナーを開始する)ために、docker CLIのラッパーと見なすことができます(実際、コメントで述べられているように、 Pythonの別の実装です)。docker-compose.ymlパラメータを取得するために呼び出されるファイルを使用します。

docker-composeファイル形式のリファレンスはここにあります

したがって、基本的にdocker-compose buildはを読み取りdocker-compose.ymlbuild:ステートメントを含むすべてのサービスを探しdocker build、それぞれに対してを実行します。

それぞれbuild:Dockerfile、dockerに渡すコンテキストと引数を指定できます。

サンプル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 

を呼び出すときdocker-compose buildは、webターゲットのみがイメージを作成する必要があります。docker buildコマンドは次のようになります。

docker build -t web_myproject -f Dockerfile-alpine ./web

2
タグ「web_myproject」はどこから来たのですか、それとも単なる例ですか?docker-composeでビルドするときに、すべてのイメージ名を指定できますか?
eyalzba

5
webコンテナ名に由来します。myprojectは現在のフォルダの名前です。これにより、両方にwebコンテナを含む2つのプロジェクトで作業する場合の競合が回避されます。
hugoShaka


docker-compose.yml上記に基づいて、webサービス名に由来します。
eigenfield

1
これも私の理解でしたが、微妙な違いがあるようです。たとえば、ファイルレイヤーのハッシュは、2つの間でわずかに異なる方法で計算されます。
vidstige


9

基本的に、docker-composeは、dockerコマンドよりもdockerを使用するためのより良い方法です。

ここでの質問がdocker-composebuildコマンドが複数のイメージを含むzipのようなものをビルドするかどうかである場合、そうでなければ通常のDockerfileとは別にビルドされますが、考え方は間違っています。

Docker-compose buildは、docker-compose.ymlの個々のサービスエントリに移動することで、個々のイメージをビルドします。

Dockerイメージ、コマンドを使用すると、保存されているすべての個々のイメージも確認できます。

本当の魔法はdocker-composeupです。

これは基本的に相互接続されたコンテナのネットワークを作成し、ホスト名に似たコンテナの名前で相互に通信できます。


5

最初の答えに追加...

サービス定義の下でイメージ名とコンテナー名を指定できます。

たとえば、以下のdocker-composeの例の「web」というサービスの場合、イメージ名とコンテナ名を明示的に指定できるため、dockerはデフォルトを使用する必要がありません。

それ以外の場合、dockerが使用するイメージ名は、フォルダー(ディレクトリ)とサービス名を連結したものになります。例:myprojectdir_web

そのため、dockerbuildコマンドの実行時に生成される目的のイメージ名を明示的に指定することをお勧めします。

例:画像:mywebserviceImage container_name:my-webServiceImage-Container

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:すると、正確なファイル名がDockerfile。になります。たとえば、build: ./web.Soの使用context:は良いものです!
eigenfield

2

docker buildとの違いについての追加の単語はほとんどありませんdocker-compose build。どちらにも、既存のイメージをレイヤーのキャッシュとして使用してイメージを構築するためのオプションがあります。

  • を使用するdocker buildと、オプションは--cache-from <image>
  • を使用するとdocker-composer、セクションにタグcache_fromがありbuildます。

残念ながら、これまで、このレベルでは、一方が作成した画像は、レイヤーのキャッシュとして他方と互換性がありませんIDは互換性がありません)。しかし、docker-compose v1.25.0(2019年11月18日)は、実験的な機能の導入COMPOSE_DOCKER_CLI_BUILDをそのようdocker-composeな用途ネイティブドッカービルダー(従って、製画像docker buildのための層のキャッシュとして使用することができますdocker-compose build

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.