在Docker Compose中,“image”和“build”的区别是什么?

69
请帮我理解Docker Compose中'image'和'build'的区别。
3个回答

65
  • image的意思是docker compose将基于该镜像运行一个容器。
  • build的意思是docker compose首先将基于与构建相关联的路径中的Dockerfile构建一个镜像(然后基于该镜像运行一个容器)。

PR 2458 最终合并,允许两者同时使用(如果存在image的话,则使用其作为构建时的镜像名称)。

therobyouknow评论中提到

dockerfile:作为build:下的子语句,可用于指定Dockerfile的文件名/路径。

version: '3'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

4
dockerfile: 作为 build: 下的子语句,可用于指定 Dockerfile 的文件名/路径。 - https://docs.docker.com/compose/compose-file/#build - therobyouknow
1
@therobyouknow 谢谢你。我已经将你的评论包含在答案中以增加可见性。 - VonC
1
+1 感谢 @VonC。我还应该说,如果dockerfile:语句可选,则docker-compose将在启动docker-compose的目录中查找名为Dockerfile的文件(即与docker-compose.yml文件位于同一文件夹中)。如果在build:语句之后直接指定了(相对)路径(这也意味着没有子语句),则docker-compose将在其中查找Dockerfile。指定目录的另一种方法是使用带有路径的context:子语句(如您的示例所示)。 - therobyouknow
3
如果我们同时使用图像和构建,会发生什么?它们之间有优先级吗,还是始终使用第二个? - Amin Bashiri
@AminBashiri 好的,我不知道它可以用于同一服务。 - VonC
显示剩余3条评论

7

build:需要Dockerfile路径作为参数,它将首先构建一个映像,然后使用该映像创建一个容器。

image:需要现有的映像名称作为参数,它将使用该映像启动容器。

示例:docker-compose.yaml

version: '3'
services:
  service1:
    build: .
    ports:
      - "5000:5000"
  service2:
    image: "redis:alpine"

service1 首先会基于当前路径下的 Dockerfile 构建镜像,然后基于该镜像运行容器。

service2 会从 Docker Hub 下载 "redis:alpine" 镜像,并在下载的镜像上运行容器。


4

官方文档深入介绍了buildimage之间的区别,这可能会对您有所帮助。https://docs.docker.com/compose/compose-file/build/ 简而言之,build需要Dockerfile的路径,以便构建镜像,但image则去存储库获取现有的镜像。两者都可以用于服务,但是

当服务定义同时包含图像属性和构建部分时,Compose实现无法保证拉取的镜像与从源代码构建相同的镜像严格等效。如果没有任何明确的用户指令,具有构建支持的Compose实现必须首先尝试拉取镜像,然后在未在注册表中找到镜像的情况下从源代码构建。Compose实现可以根据用户请求提供自定义此行为的选项。


在我的情况下,docker-compose up将会构建镜像,docker compose up则会先拉取再构建镜像。我还没有找到一种"如果存在则拉取,否则构建"的方法。 - user1473249581

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