“docker-compose build”和“docker build”有什么区别?

148

docker-compose builddocker build 有什么区别?假设在 Docker 化项目路径中存在一个 docker-compose.yml 文件:

docker-compose build

docker build
5个回答

167

docker-compose可以被认为是docker CLI的一个包装器(实际上它是另一种用Python实现的方式,正如评论中所说的那样),以节省时间并避免500个字符长的行(还可以同时启动多个容器)。 它使用名为docker-compose.yml的文件来检索参数。

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

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

每个build:都可以指定一个Dockerfile、一个上下文和要传递给docker的args。

最后举一个例子: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

8
"web_myproject" 标签是从哪里来的?还是只是一个例子?在使用 docker-compose 构建时,可以指定所有图像名称吗? - eyalzba
9
web 来自容器名称。 myproject 是您所在的文件夹名称。 这样可以避免在您同时处理包含 web 容器的两个项目时出现冲突。 - hugoShaka
请查看以下网址:https://dev59.com/gVsX5IYBdhLWcg3wcPEF。 - hugoShaka
根据上面提供的 docker-compose.yml 文件,web 是服务名称。 - daparic
1
这也是我的理解,但似乎存在一些细微的差异。例如,在两者之间计算文件层哈希时略有不同。 - vidstige

29

14

简而言之,docker-compose是比仅使用docker命令更好的使用docker的方法。

如果问题在于使用docker-compose build命令是否会构建一个包含多个镜像的zip文件,则这种想法是错误的。

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

使用docker images命令,我们也可以看到所有单独的镜像被保存了。

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

这个命令将创建一个相互连接并可以使用容器名称相似于主机名相互通信的容器网络。


7

补充第一条回答...

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

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

否则,Docker将使用文件夹(目录)和服务名称的拼接。例如:myprojectdir_web

因此,最好明确地放置期望的映像名称,以便在执行docker build命令时生成。

例如: image: 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 中。因此,使用 context: 是一个好选择! - daparic

6
关于 docker builddocker-compose build 之间的区别,以下是一些补充说明。两者都有使用现有镜像作为层缓存来构建映像的选项。 不幸的是,到目前为止,这两个命令生成的映像在此级别上不兼容对方的层缓存(Ids 不兼容)。然而,docker-compose v1.25.0 (2019-11-18) 引入了一个实验性功能COMPOSE_DOCKER_CLI_BUILD ,使得 docker-compose 使用本地 docker 构建器(因此,使用 docker build 生成的映像可以作为 docker-compose build 的层缓存)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接