【问题标题】:Getting docker-compose to build container that uses a parent container让 docker-compose 构建使用父容器的容器
【发布时间】:2021-01-30 01:00:46
【问题描述】:

我有一个设置,我正在从一组 shell 脚本迁移到 docker-compose。我要构建的容器使用由自定义 dockerfile 创建的父容器。但我看不到如何让 docker-compose (重新)构建必要的父容器。

一共有三个文件:

/code/containers/parent/DockerFile

FROM centos:7  
RUN... (rest of file to create common stuff used by multiple child images)

/code/containers/child-one/Dockerfile

FROM parent
RUN...

/code/docker-compose.yml

version: '3.3'
services:
  my-service:
    image: child-one
    build:
      dockerfile: containers/child-one/Dockerfile
      context: .

正如预期的那样,它会失败:
服务“我的服务”构建失败:找不到存储库父级:不存在或没有拉取访问权限

除了手动运行 docker 先构建父镜像之外,找不到任何解决方案。

非常感谢任何想法。

编辑:基于 VonCs 的想法:

version: '3.3'
services:
  parent-notservice;
    image: parent
    build:
      dockerfile: containers/parent/Dockerfile
      context: .

  my-service:
    image: child-one
    depends_on:
      parent
    build:
      dockerfile: containers/child-one/Dockerfile
      context: .

但是我不得不使用depends_on,这是一个hack,我担心父母开始的影响(当孩子跑步时)。这不是我的意图。

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    自 2021 年 1 月起,还有另一种方法可以使用 profiles 键来执行此操作。在 Docker Compose 1.28.0 中添加了对这个键的支持。

    version: '3.9'
    services:
      parent-notservice:
        build:
          dockerfile: containers/parent/Dockerfile
          context: .
        profiles:
          - donotstart
    
      my-service:
        image: parent-notservice
    
      another-service:
        build:
          context: .
          dockerfile: ./containers/service/Dockerfile
    

    my-service 将直接基于parent-notservice. 然后您可以在docker-compose.yml 文件中添加该容器所需的任何portsvolumes

    another-service 将从 Dockerfile 构建,该 Dockerfile 也可以基于 parent-notservice 使用 FROM 命令。然后可以在该容器上安装不属于父容器的其他包。

    FROM parent-notservice
    RUN...
    

    最好的部分是当您使用docker-compose up 时,parent-notservice 不会启动。

    有关profiles 密钥的更多文档可在此处找到:https://docs.docker.com/compose/profiles/

    【讨论】:

      【解决方案2】:

      如果您的构建设置名称为“parent”(docker build -t parent),则“parent”将存在于您的本地 docker 注册表中

      使用 docker-compose 文件,您需要先构建 parent/DockerFile,在您的 build directive 下使用 image: parent

      但是,您应该只构建您打算运行 的服务,而“父级”的情况并非如此:应该在涉及 docker-compose 之前构建父级
      正确的解决方案是有一个包装脚本:

      • docker build -t parent ...
      • 然后拨打docker-compose

      没有更多的depends_on hack 在虚构的服务之间(parent 没有“服务”:那里没有运行)。

      【讨论】:

      • 干杯 VonC,基于我所知道的:版本:'3.3' 服务:parent-notservice;图像:父构建:dockerfile:容器/父/Dockerfile 上下文:.我的服务:图像:child-onedepends_on:父构建:dockerfile:容器/child-one/Dockerfile 上下文:。但是,使用depends_on 是一种黑客行为,我担心在孩子运行时父母会开始。
      • @Duckman 实际上,我已经修改了我的答案以提出另一种方法。
      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2022-11-13
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多