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


Answers:


106

docker-compose可以认为是Docker CLI的包装器(实际上,它是python中的另一种实现,如注释中所述),以节省时间并避免500个字符长的行(并同时启动多个容器)。它使用一个名为docker-compose.yml来检索参数。

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

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

每个人都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

2
标签“ web_myproject”是从哪里来的?或者仅仅是一个例子?使用docker-compose进行构建时,可以指定所有映像名称吗?
eyalzba

5
web来自容器名称。myproject是您所在文件夹的名称。如果您在两个都包含web容器的项目上工作,则可以避免冲突。
hugoShaka '19


基于docker-compose.yml以上提供的内容,web来自服务名称。
eigenfield '19

1
这也是我的理解,但似乎存在一些细微的差异。例如,文件层的哈希值在两者之间略有不同。
vidstige


9

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

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

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

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

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

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


5

添加到第一个答案...

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

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

否则,docker将使用的映像名称将是文件夹(目录)和服务名称的串联。例如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

将subdir指定为force值将build:强制您将确切文件名设为Dockerfile。例如,在build: ./web.So中,使用context:是一个很好的选择!
eigenfield '19

2

约之间的差别一些额外的单词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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.