【问题标题】:What is the difference between `docker-compose build` and `docker build`?`docker-compose build` 和 `docker build` 有什么区别?
【发布时间】:2018-10-18 05:10:43
【问题描述】:

docker-compose builddocker build 有什么区别?

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

docker-compose build

docker build

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    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】:

      docker-compose 可以被认为是 docker CLI 的包装器(实际上它是 python 中的另一个实现 said in the comments),以便节省时间并避免 500 个字符长的行(并且同时启动多个容器时间)。它使用一个名为docker-compose.yml 的文件来检索参数。

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

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

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

      【讨论】:

      • 标签“web_myproject”是从哪里来的,还是只是一个例子?使用 docker-compose 构建时可以指定所有图像名称吗?
      • web 来自容器名称。 myproject 是您所在文件夹的名称。如果您处理两个项目都包含 web 容器,这可以避免冲突。
      • 基于上面提供的docker-compose.ymlweb来自服务名。
      • 这也是我的理解,但似乎有一些细微的差别。例如,文件层哈希的计算在两者之间略有不同。
      【解决方案3】:

      基本上,docker-compose 是使用 docker 的一种更好的方式,而不仅仅是一个 docker 命令。

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        添加到第一个答案...

        可以在服务定义下给出镜像名称和容器名称。

        例如对于以下 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
        

        【讨论】:

        • 将子目录指定为build: 的值会强制您使用Dockerfile 的确切文件名。比如在build: ./web中。所以使用context:就不错了!
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-07-04
          • 1970-01-01
          • 2016-10-24
          • 1970-01-01
          • 2016-03-22
          • 1970-01-01
          • 2016-02-16
          • 1970-01-01
          相关资源
          最近更新 更多