如何在同一个项目中为不同的版本指定不同的.dockerignore文件?

esbemjvw  于 2022-11-02  发布在  Docker
关注(0)|答案(6)|浏览(179)

我曾经在.dockerignore中列出tests目录,这样它就不会包含在我用来运行Web服务的映像中。
现在,我尝试使用Docker来运行单元测试,在本例中,我希望包含tests目录。
我检查了docker build -h,没有发现相关的选项。
我该怎么做?

svdrlsy4

svdrlsy41#

Docker 19.03为此提供了一个解决方案。
Docker客户端首先尝试加载<dockerfile-name>.dockerignore,如果找不到,福尔斯到.dockerignore。因此,docker build -f Dockerfile.foo .首先尝试加载Dockerfile.foo.dockerignore
当前需要设置DOCKER_BUILDKIT=1环境变量才能使用此功能。此标志可以与docker compose一起使用,自also specifying COMPOSE_DOCKER_CLI_BUILD=1的1.25.0-rc 3起。
另请参阅注解0、注解1、注解2
来自Mugen的评论,请注意
自定义dockerignore应该与Dockerfile位于同一目录中,而不是像原始的.dockerignore一样位于根上下文目录中
也就是说
呼叫时

插接器_构建套件=1

docker构建-f /路径/到/custom.Dockerfile...
您的.dockerignore文件应该位于
/路径/到/custom.Dockerfile.停靠忽略

oalqel3c

oalqel3c2#

目前,还没有办法做到这一点。有一个冗长的讨论关于添加一个--ignore标志到Docker,以提供忽略文件使用-请参阅here
你目前的选择大多是丑陋的:

  • 将您的项目拆分为子目录,每个子目录都有自己的Dockerfile.dockerignore,这在您的情况下可能不起作用。
  • 创建一个脚本,将相关文件复制到一个临时目录中,并在那里运行Docker构建。
suzh9iv8

suzh9iv83#

在这里可以选择将清理过的测试作为卷装载添加到容器中。在构建映像后,如果运行它进行测试,请将包含测试的源代码装载到清理过的代码之上。

services:
   tests:
      image: my-clean-image
      volumes:
         - '../app:/opt/app' # Add removed tests
mpbci0fu

mpbci0fu4#

我已经尝试按照@thisismydesign的建议激活DOCKER_BUILDKIT,但是我遇到了其他问题(超出了这个问题的范围)。
作为一种替代方法,我使用-T标志创建一个中间tar,它接受一个txt文件,该文件包含要包含在我的tar中的文件,因此它与白名单. dockerignore没有太大区别。
我导出这个tar并将其通过管道传递给docker build命令,然后指定我的docker文件,它可以位于文件层次结构中的任何位置。
tar -czh -T files-to-include.txt | docker build -f path/to/Dockerfile -

nxowjjhe

nxowjjhe5#

另一个选择是有一个进一步的构建过程,其中包括测试。我这样做:
如果测试是 * 单元测试 *,那么我创建一个新的Docker映像,它是从主项目映像派生的;我只是在顶部粘贴一个FROM,然后粘贴ADD测试,以及任何所需的工具(在我的例子中,mochachai等)。这个新的“测试”映像现在包含 * 测试和要测试的原始源代码。然后,它可以简单地按原样运行,也可以在“监视模式”下运行卷Map到主机上的源目录和测试目录。
如果测试是 * 集成测试 *(例如,主映像可能是GraphQL服务器),则我创建的映像是自包含的,即不是从主映像派生的(当然,它仍然包含测试和工具)我的测试使用环境变量来告诉他们在哪里可以找到需要测试的端点,并且很容易让DockerCompose启动一个使用主映像的容器和另一个使用集成测试映像的容器,并设置环境变量,以便测试套件知道要测试什么。

ppcbkaq5

ppcbkaq56#

遗憾的是,目前还不能指向用于.dockerignore的特定文件,所以我们在构建脚本中基于target/platform/image生成它。作为一个Docker爱好者,这是一个可悲而尴尬的解决方案。

相关问题