【问题标题】:docker compose - ignore build context pathdocker compose - 忽略构建上下文路径
【发布时间】:2019-04-22 16:04:38
【问题描述】:

我有一个带有build context 属性的 docker-compose.yml 文件,如下所示:

version: '3'
services:
  my-service:
    container_name: my-service
    image: my-service
    build:
      context: foo
    ports:
    - 8088:8088

  # other services

当我在本地运行docker-compose up 时,构建上下文确实 存在并且一切正常。但是,我的 CI 服务器配置为使用相同的 docker-compose.yml 文件,但没有 no 构建上下文(图像通过 SSH 复制为 .tar 存档,然后通过 docker load 加载)。 现在我有一个错误:

错误:构建路径 /foo 要么不存在,要么不可访问,要么 不是有效的网址。

所以我试图找到一种方法来抑制在运行 docker-compose up 时查找此构建上下文(我不想构建图像,因为它们已经是最新的),但 docker-compose up --no-build 没有工作。有什么想法吗?

【问题讨论】:

  • 但重点是我不想修改 docker-compose.yml 文件。该文件从存储库复制到 CI 服务器,所以我不想更改它(我可能不得不使用一些正则表达式)。或者,我可以维护两个单独的撰写文件,但如果没有必要,我想避免它
  • 您是否尝试在回购的根目录中添加foo 目录,其中包含空.keepReadme 文件,这解释了为什么需要空目录。
  • 在 CI 服务器上没有 foo 目录。只有 .tar 存档与 docker 图像
  • 我根据您的问题打开了一个功能请求,以防有人想在那里点赞:github.com/docker/compose/issues/7674
  • 我发现了关于同一问题的公开讨论github.com/docker/compose/issues/4047。它不能解决问题,但有一些解决方法

标签: docker docker-compose continuous-integration suppress


【解决方案1】:

docker-compose.override.yml 在这种情况下是很好的解决方案。您可以只覆盖构建块,这并不难作为两个独立文件进行维护。

docker-compose.override.yml:

version: '3'
  services:
    my-service:
      build:
        context: foo

docker-compose.yml

version: '3'
  services:
    my-service:
      container_name: my-service
      image: my-service
      ports:
        - 8088:8088

https://docs.docker.com/compose/extends/

【讨论】:

  • 恕我直言,这会导致额外的复杂性。只需使用docker-compose up --no-build。正如@zeehio 所说的那样。
【解决方案2】:

我将您的问题作为功能请求发布在 docker-compose 存储库上。让我们看看它是如何进展的:

https://github.com/docker/compose/issues/7674

同时,您必须通过修改执行 docker-compose up --no-build 的 CI 脚本来解决此问题,使其执行您需要的 mkdir -p ...

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,在“docker-compose config”提供跳过目录存在检查的方法之前,我的解决方案是自动创建那些“docker-compose config”期望的目录。

    这是一个可以做到这一点的单线:

    egrep '    (context:|build)' < docker-compose.yml | sed -E 's/\s+\S+:\s*//' | xargs mkdir -p .
    

    这很难看,但我想不出另一种方法。 (dngnezdi 提到的 .extends. 方法不是解决方案,因为我需要一个自动方法。)

    【讨论】:

    • 我试过了,但我得到一个错误“无法找到指定的 Dockerfile”:Dockerfile,如果我创建一个空的 Dockerfile,我得到一个错误“Dockerfile(Dockerfile)不能为空”。你做了什么?
    猜你喜欢
    • 2018-06-15
    • 2020-08-06
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多