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

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

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

docker-compose build

А также

docker build
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
94
0
88 452
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

docker-compose build создаст службы в файле docker-compose.yml.

https://docs.docker.com/compose/reference/build/

docker build создаст образ, определенный Dockerfile.

https://docs.docker.com/engine/reference/commandline/build/

Ответ принят как подходящий

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

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

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

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

В заключение приведем пример файла 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

Откуда появился тег web_myproject или это просто пример? Можно ли вообще указать имя образа при сборке с помощью docker-compose?

eyalzba 30.01.2019 08:18
web происходит от названия контейнера. myproject - это имя папки, в которой вы находитесь. Это позволяет избежать конфликтов, если вы работаете над двумя проектами, каждый из которых содержит контейнер web.
hugoShaka 30.01.2019 11:53

Пожалуйста, взгляните на stackoverflow.com/questions/33816456/…

hugoShaka 30.01.2019 11:54

Исходя из приведенного выше docker-compose.yml, web происходит от имени службы.

eigenfield 23.10.2019 20:55

Это тоже было моим пониманием, но, похоже, есть некоторые тонкие различия. Например, хэши файловых слоев между ними вычисляются немного по-разному.

vidstige 06.02.2020 09:03

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

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

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

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

Настоящая магия - это docker-compose up.

Это в основном создаст сеть взаимосвязанных контейнеров, которые могут взаимодействовать друг с другом с именем контейнера, аналогичным имени хоста.

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

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

например для службы под названием «web» в приведенном ниже примере создания докеров вы можете явно указать имя изображения и имя контейнера, чтобы докеру не приходилось использовать значения по умолчанию.

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

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

например изображение: 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

Указание подкаталога в качестве значения build: заставляет вас иметь точное имя файла как Dockerfile. Например, в build: ./web. Так что использование context: - это хорошо!

eigenfield 23.10.2019 21:16

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

  • с docker build опция --cache-from <image>
  • с docker-composer в разделе cache_from есть тег build.

К сожалению, до сих пор на этом уровне изображения, созданные одним из них, несовместимы с другим в качестве кэша слоев (Идентификаторы несовместимы). Однако docker-composev1.25.0 (18.11.2019) представляет экспериментальную функцию COMPOSE_DOCKER_CLI_BUILD, так что docker-compose использует собственный конструктор докеров (поэтому образы, созданные docker build, могут использоваться в качестве кеша слоев для docker-compose build)

Другие вопросы по теме