【问题标题】:Multiple Dockerfiles in project with different contexts项目中具有不同上下文的多个 Dockerfile
【发布时间】:2019-01-12 21:06:23
【问题描述】:

我有一个存储库,我需要在其中创建多个 Dockerfile,但它们中的每一个都应该有不同的上下文。

我喜欢here 发布的解决方案,但它并不完全适合我的用例。

不,这不是重复的。这是一个不同的用例。请继续阅读

我知道最好上下文中排除不必要的文件夹,尤其是当它们很大时。嗯,我的项目包含几个文件夹,其中一些非常大

为简单起见,假设这是我项目的文件树:

  • hugeFolder1/
  • hugeFolder2/
  • littleFolder1/
  • littleFolder2/

假设我需要创建两个 Dockerfile(在solution that I previously mentioned 之后):

  • docker/A/Dockerfile A”
  • docker/B/Dockerfile B”
  • docker-compose.yml

现在重点是:

  • A 只需要hugeFolder1 和两个小文件夹。
  • B 只需要hugeFolder2 和两个小文件夹。

所以我想分别排除不需要的大文件夹。

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 与您的docker-compose.yml 文件相关的hugeFolder1 等在哪里?
  • @larsks 我想使用我链接的那个解决方案,这里解释了关系
  • 您需要docker-compose 还是简单地将docker/A/ 设置为上下文和ADD ../../hugeFolder1 /somepathADD ../../littleFolder1 /someotherpath 等?
  • 在您的问题中包含任何相关信息确实很有帮助。
  • @bluescores 我想也有docker-compose 会很好。我仍然不确定它是否是严格需要的。

标签: docker docker-compose dockerfile


【解决方案1】:

编辑:以前的答案是将文件夹添加到构建上下文之外的图像中,这是行不通的。此外,OP 澄清了内容以及图像将如何在 cmets 中使用,展示了一个非常好的多阶段构建用例。

我会根据提供的信息尝试一下。

首先,您不能从给定的 docker 上下文中排除文件夹。如果你使用docker build -t bluescores/myimage /some/path,你的上下文是/some/path/**/*。不排除大文件夹、小文件夹或其中的任何内容。

其次,为了使用ADDCOPY 将文件带入您的docker镜像,它们必须存在于构建上下文中。

也就是说,听起来您最终会使用大文件夹和小文件夹的各种组合。我认为你最好坚持你已经概述的现有策略,并进行一些优化 - 即使用多阶段构建。

暂时跳过docker-compose

您引用的解决方案here 并不是真正旨在解决密切控制上下文的问题。这是一个与您所问的完全不同的问题的好答案。您现在只是在尝试构建图像,虽然docker-compose 可以处理这个问题,但它并没有带来任何docker build 所没有的东西。当您需要编排您正在构建的这些容器时,docker-compose 将是不可思议的。

如果您不确定是否需要 docker-compose,请尝试不使用它。以后您可以随时将其重新加入。

现在我的形象是巨大的

看看multi-stage builds 是不是你可以使用的东西。

这基本上可以让您从COPY 巨大文件夹中的映像中挑选构建输出,并将该输出放入一个新的、更小、更清晰的映像中。

【讨论】:

  • 非常感谢您的回答。 hugeFolder1 将充满我需要合并并导入到我的数据库中的 SQL 文件(然后我可以删除它们)。 hugeFolder2 充满了我需要编译的源文件(然后我可以删除它们)。有了这些信息,是否可以进行任何优化?
  • 关于图像大小(听起来会因为这些巨大的文件夹而变得相当大),多阶段构建将是要走的路。请记住,对于多阶段,您不会从最终映像中删除任何内容,而是从一个容器中提取一些构建工件(例如已编译的项目)并将所有这些巨大的文件夹留在后面。听起来这将是在这里探索的好选择。花时间让它在没有多阶段的情况下工作,然后阅读并尝试它。
  • ADD failed: Forbidden path outside the build context: ../../hugeFolder1 ()
  • 哇,我的疏忽大了。我发布的这个解决方案根本不起作用,因为构建上下文中不包含巨大的文件夹。无论如何,您仍然可以使用多阶段构建来大大优化最终图像。但是您将不得不在构建映像上下文中包含该根目录以及大目录和小目录。
  • @FrancescoBorzì 我更新了我的答案以反映这里的 cmets。删除了关于在构建上下文之外使用 ADD 的错误信息。总体而言,我认为您制定的当前策略很好,但是您可以使用我们一直在讨论的多阶段大大缩小最终图像。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2013-05-08
  • 2017-05-21
相关资源
最近更新 更多