В чем разница между `docker-compose build` и` docker build`?

В чем разница между docker-compose build docker build?

Предположим, что в докеризованном пути проекта есть файл docker-compose.yml:

docker-compose build

А также

docker build

Ответ 1

docker-compose - это оболочка для командной строки докера, чтобы выиграть время и избежать строк длиной в 500 символов (а также запустить несколько контейнеров одновременно). Он использует файл с именем docker-compose.yml для получения параметров.

Вы можете найти ссылку на формат файла docker-compose здесь.

Таким образом, в основном docker-compose build будет читать ваш docker-compose.yml, искать все сервисы, содержащие инструкцию build: и запускать docker build для каждого из них.

Каждая build: может указывать Dockerfile, контекст и аргументы для передачи в Docker.

В заключение docker-compose.yml файла 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-compose build. Команда docker build будет выглядеть так:

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

Ответ 3

По сути, docker-compose - это лучший способ использования docker, чем просто команда docker.

Если здесь возникает вопрос: если команда сборки docker-compose создаст zip файл, содержащий несколько изображений, которые в противном случае были бы скомпилированы отдельно с обычным Dockerfile, то это неверное мышление.

Docker-compose build, создаст отдельные образы, перейдя в отдельную запись сервиса в docker-compose.yml.

С помощью команды docker images мы можем видеть, как сохраняются все отдельные изображения.

Настоящая магия состоит в том, чтобы составлять докер.

Этот в основном создаст сеть взаимосвязанных контейнеров, которые могут общаться друг с другом с именем контейнера, похожим на имя хоста.

Ответ 4

Добавление к первому ответу...

Вы можете дать имя изображения и имя контейнера в соответствии с определением сервиса.

например, для службы под названием "web" в приведенном ниже примере docker-compose вы можете явно указать имя изображения и имя контейнера, чтобы docker не использовал значения по умолчанию.

В противном случае имя образа, которое будет использовать docker, будет объединением папки (Directory) и имени службы. например, myprojectdir_web

Поэтому лучше явно указать желаемое имя образа, которое будет сгенерировано при выполнении команды сборки docker.

например, изображение: mywebserviceImage имя-контейнера: 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