首页 > 解决方案 > 项目中具有不同上下文的多个 Dockerfile

问题描述

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

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

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

我知道最好从上下文中排除不必要的文件夹,尤其是当它们很大的时候。好吧,我的项目由几个文件夹组成,其中一些真的很大

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

并假设我需要创建两个 Dockerfile(按照我之前提到的解决方案):

现在的重点是:

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

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

标签: dockerdocker-composedockerfile

解决方案


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

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

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

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

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

docker-compose暂时跳过

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

如果您不确定是否需要docker-compose,请尝试在没有它的情况下执行此操作。您以后可以随时将其重新混音。

现在我的形象是巨大的

看看你是否可以使用多阶段构建。

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


推荐阅读