Docker Compose - 忽略构建上下文路径

11

我有一个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 文件,但是没有构建上下文(镜像通过 SSH 复制为 .tar 归档文件,然后通过 docker load 加载)。 现在我遇到了一个错误:

错误:构建路径 /foo 不存在,无法访问或不是有效的 URL。

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

如果您想避免将其设置为 "。",只需将其设置为空目录即可。但是,该目录必须存在,这就是为什么(除其他原因外)在项目根目录中创建一个 docker 目录并将 Docerfile 移动到其中的常见做法。然后在 docker 目录中构建,它将成为一个空上下文。 - lependu
3
但重点是我不想修改docker-compose.yml文件。这个文件从存储库复制到CI服务器,所以我不想改变它(我可能需要使用一些正则表达式)。或者,我可以维护两个独立的compose文件,但如果不必要的话,我想避免这样做。 - k13i
1
你尝试在仓库的根目录中添加一个名为 foo 的文件夹,并在其中放置一个空的 .keepReadme 文件,以解释为什么需要这个空文件夹吗? - lependu
1
在CI服务器上没有foo目录,只有一个带有Docker镜像的.tar归档文件。 - k13i
2
我根据你的问题提出了一个功能请求,以防有人想要点赞:https://github.com/docker/compose/issues/7674 - zeehio
1
我在 https://github.com/docker/compose/issues/4047 上找到了一个关于同样问题的开放讨论。虽然它并没有解决问题,但有一些变通方法。 - Maria Dorohin
3个回答

3

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

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

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


3

在这种情况下,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

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


1
在我看来,这会增加额外的复杂性。只需使用 docker-compose up --no-build 命令即可。就像 @zeehio 所说的那样。 - Emran
1
@EmranBatmanGhelich 我们可以在 up 命令中使用 --no-build,但是我们在 down 中仍然面临相同的问题。 docker-compose down 仍需要构建上下文,并且 --no-build 在 down 中不起作用。 - Hieu Le

0

我曾经遇到过同样的问题,我的解决方案是,在“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)不能为空”。你对此做了什么? - Maria Dorohin

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