`docker-compose build`和`docker build`有什么区别?

时间:2018-05-08 09:32:16

标签: docker docker-compose dockerfile

docker-compose builddocker build之间有什么区别?

假设在一个dockerized项目路径中有一个docker-compose.yml文件:

docker-compose build

docker build

5 个答案:

答案 0 :(得分:35)

docker-compose是docker CLI的包装器,以便获得时间并避免500个字符长的行(并且同时启动多个容器)。它使用名为docker-compose.yml的文件来检索参数。

您可以找到docker-compose文件格式here的参考。

所以基本上docker-compose build会读取您的docker-compose.yml,查找包含build:语句的所有服务,并为每个服务运行docker build

Each build:可以指定Dockerfile,上下文和args传递给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

答案 1 :(得分:10)

docker-compose build将在docker-compose.yml文件中构建服务。

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

docker build将构建Dockerfile定义的图像。

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

答案 2 :(得分:2)

基本上,docker-compose比使用docker命令是一种更好的使用docker的方法。

如果这里的问题是docker-compose build命令是否将构建一个包含多个图像的zip东西,否则将与通常的Dockerfile分开构建,那么这种想法是错误的。

Docker-compose构建,将通过进入docker-compose.yml中的单个服务条目来构建单个映像。

使用docker images命令,我们还可以看到所有保存的单个图像。

真正的魔力在于docker-compose up。

这基本上将创建一个互连的容器网络,该网络可以使用类似于主机名的容器名称相互通信。

答案 3 :(得分:0)

添加到第一个答案...

您可以在服务定义下提供图像名称和容器名称。

例如对于以下docker-compose示例中名为“ web”的服务,您可以显式指定映像名称和容器名称,这样docker不必使用默认值。

否则,docker将使用的映像名称将是文件夹(目录)和服务名称的串联。例如myprojectdir_web

因此,最好明确地指定将在执行docker build命令时生成的所需映像名称。

例如 图片: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

答案 4 :(得分:0)

关于docker builddocker-compose build之间的区别的其他词汇。 两者都可以选择使用现有图像作为图层缓存来构建图像。

不幸的是,到目前为止,在这个级别上,由一个人制作的图像与另一个人作为层缓存(Ids are not compatible)不兼容。 但是,docker-compose v1.25.0 (2019-11-18)引入了实验性功能COMPOSE_DOCKER_CLI_BUILD,以便docker-compose使用本机docker构建器(因此,由docker build制作的图像可用作缓存docker-compose build的层数