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


74

我曾经列出该tests目录,.dockerignore以便它不会被包含在用于运行Web服务的映像中。

现在,我尝试使用Docker运行我的单元测试,在这种情况下,我希望tests包含该目录。

我已经检查docker build -h并发现没有相关的选项。

我怎样才能做到这一点?


使用不同的基本目录?
亨利

Answers:


86

Docker 19.03为此提供了一个解决方案。

Docker客户端尝试首先加载<dockerfile-name>.dockerignore,然后.dockerignore在找不到时回退。因此,docker build -f Dockerfile.foo .首先尝试加载Dockerfile.foo.dockerignore

DOCKER_BUILDKIT=1要使用此功能,当前需要设置环境变量。docker compose1.25.0-rc3开始也可以通过指定COMPOSE_DOCKER_CLI_BUILD=1来使用此标志。

也可以看看:


9
注意自定义dockerignore应在同一目录中Dockerfile,而不是在根上下文目录和原来一样.dockerignore
木根

1
@Mugen-如果Dockerfile位于上下文的子目录中,相对于Dockerfile的位置,Docker中的路径是否被忽略?(因此您可以忽略例如../foo?)
shaunc

4
@shaunc令人惊讶的是,它们与上下文的位置有关
Mugen

我已经尝试过了,但它不适用于
docker

如果您在Dockerfile中使用实验性语法,则此方法不起作用:# syntax = docker/dockerfile:1.0-experimental
Aalex Gabi

17

目前,尚无办法。关于--ignore在Docker上添加标志以提供要使用的忽略文件,已经进行了很长时间的讨论-请在此处查看

您目前所拥有的选择大多很难看:

  • 将您的项目分成各自具有Dockerfile和的子目录.dockerignore,这可能不适用于您的情况。
  • 创建一个脚本,将相关文件复制到一个临时目录中,并在其中运行Docker构建。

似乎还有很多其他选择。也许太多了。一种是将不需要的文件临时移动到忽略的目录中(我认为这甚至可以减少上下文)。另一个方法是创建一个压缩包以添加到图像中(这对上下文的大小没有帮助)。另一个是拥有备用的忽略文件,并.docker_ignore根据需要将其移至名称中。
入睡

3

在这里,可以将清理后的测试作为卷安装添加到容器中。生成映像后,如果运行它进行测试,则将包含测试的源代码安装在清理后的代码之上。

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

这是与docker-compose但有关的docker build
亚历山大·米尔斯

1
@AlexanderMills这等效于docker run -v "`pwd`/app:/opt/app" my-clean-image
Blaise

1

另一个选择是拥有包含测试的进一步构建过程。我这样做的方式是这样的:

如果测试是单元测试,那么我将创建一个从主项目映像派生的新Docker映像;我只是坚持一个FROM在顶部,然后ADD测试,以及任何所需的工具(在我的情况,mochachai等)。现在,此新的“测试”映像同时包含测试和要测试的原始源。然后,可以直接按原样运行它,也可以将其卷映射到主机上的源目录和测试目录以“监视模式”运行。

如果测试是集成测试(例如主映像可能是GraphQL服务器),那么我创建的映像是独立的,即不是从主映像派生的(当然,它仍然包含测试和工具) )。我的测试中使用环境变量,告诉他们在哪里可以找到端点需要测试,这是很容易得到多克尔撰写带来了利用主要图像的容器,并使用集成测试图像的另一容器,设置环境变量这样测试套件就知道要测试什么。


0

我曾尝试DOCKER_BUILDKIT按照@thisismydesign的建议激活,但遇到其他问题(超出此问题的范围)。

或者,我通过使用-T标志创建一个中间tar,该标志接受一个txt文件,其中包含要包含在tar中的文件,因此它与白名单.dockerignore没什么不同。

我导出此tar并将其通过管道传递到docker build命令,并指定我的docker文件,该文件可以存在于文件层次结构中的任何位置。最后看起来像这样:

tar -czh -T files-to-include.txt | docker build -f path/to/Dockerfile -

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.