如何防止docker-compose多次构建相同的图像?

Nic*_*ick 19 docker docker-compose

docker-compose.yml指定了多个图像.其中两个图像使用相同的本地构建Dockerfile.它们共享相同的图像名称,但每个都有不同的命令.

在开发过程中,我经常使用docker-compose up --build重建图像.问题是docker构建了myimage两次 - 花费的时间超过了必要的时间.

有没有办法表达图像只需要构建一次?

version: '2'
services:

  abc:
    image: myimage
    command: abc
    build:
      context: .
      dockerfile: Dockerfile

  xyz:
    image: myimage
    command: xyz
    build:
      context: .
      dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

ama*_*ath 26

根据用于构建的docker-compose文件文档,指定build:image:用于第一个服务,然后仅image:用于后续服务.

这是您的示例的修改版本,仅构建映像一次(对于abc服务)并将该映像重用于xyz服务.

version: '2'
services:

  abc:
    image: myimage
    command: abc
    build:
      context: .
      dockerfile: Dockerfile

  xyz:
    image: myimage
    command: xyz
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在 xyz 服务中添加 `depends_on: [abc]` (7认同)
  • 在重新阅读答案中链接的文档后,这似乎仍然是最小化`docker-compose up --build`时间的最佳方法. (3认同)
  • 使用这种方法,“docker-compose pull”现在尝试从 Docker Hub 中提取“myimage”...但它显然不存在。否则,这种方法可以节省我的构建时间一分钟或更长时间。 (3认同)
  • 要解决上述“docker compose pull”问题,可以使用“pull_policy: never”属性装饰所有“myimage”用法。虽然有点啰嗦,但是解决了问题 (2认同)

luc*_*ald 16

您可以伪造仅构建服务来构建映像,然后将依赖项用于实际工作人员。这样做的优点是,如果您想启动其他服务,则不会自动启动其中一项服务。

您需要添加一个图像名称来指定build:构建image:服务,并确保它终止并且永远不会自动重新启动。然后image:depends_on: first_service您服务。

像这样:

version: '2'
services:
  _myimage_build:
    image: myimage
    command: ['echo', 'build completed']  # any linux command which directly terminates.
    build:
      context: .
      dockerfile: Dockerfile

  first_service:
    image: myimage
    depends_on:
    - _myimage_build
    command: abc
    
  second_service:
    image: myimage
    depends_on:
    - _myimage_build
    command: xyz
Run Code Online (Sandbox Code Playgroud)

感谢@amath 的回答。

确保先构建myimage镜像 ( _myimage_build),然后再尝试使用其他镜像:docker compose build _myimage_build

  • 我完全按照你的做法,但得到“我的图像的拉取访问被拒绝,存储库不存在或可能需要'docker登录':被拒绝:请求的资源访问被拒绝” (2认同)

Dav*_*ido 5

让@amath 的好答案更清晰一点

您需要添加一个图像名称来指定build:image:用于第一个服务,然后image:depends_on: first_service用于后续服务。

像这样:

version: '2'
services:

  first_service:
    image: myimage
    command: abc
    build:
      context: .
      dockerfile: Dockerfile

  second_service:
    image: myimage
    command: xyz
    depends_on:
    - first_service
Run Code Online (Sandbox Code Playgroud)

感谢@DrSensor 的评论

  • 我完全按照你的做法,但得到“我的图像的拉取访问被拒绝,存储库不存在或可能需要'docker登录':被拒绝:请求的资源访问被拒绝” (4认同)