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

时间:2016-12-01 07:01:15

标签: docker

我曾在tests列出.dockerignore目录,因此它不会包含在我用来运行网络服务的图片中。

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

我检查了docker build -h,发现没有选项相关。

我该怎么做?

5 个答案:

答案 0 :(得分:16)

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

  

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

当前需要设置DOCKER_BUILDKIT=1环境变量才能使用此功能。自1.25.0-rc3also specifying COMPOSE_DOCKER_CLI_BUILD=1以来,此标志可与docker compose一起使用。

另请参阅:

答案 1 :(得分:13)

目前,没有办法做到这一点。关于向Docker添加--ignore标志以提供要使用的忽略文件的讨论很长 - 请参阅here

您目前的选择大多是丑陋的:

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

答案 2 :(得分:2)

将清理后的测试作为卷装入添加到容器中可以是一个选项。构建映像后,如果运行它进行测试,请在清理后的代码之上安装包含测试的源代码。

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

答案 3 :(得分:0)

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

如果测试是单元测试,那么我创建一个从主项目图像派生的新Docker镜像;我只是将FROM放在顶部,然后ADD测试,加上任何必需的工具(在我的情况下,mochachai等等)。这个新的“测试”图像现在包含两个测试和要测试的原始源。它可以简单地按原样运行,也可以在“监视模式”下运行,并将卷映射到主机上的源和测试目录。

如果测试是集成测试 - 例如主映像可能是GraphQL服务器 - 那么我创建的映像是自包含的,即不是从主映像派生的(它当然还包含测试和工具)。我的测试使用环境变量来告诉他们在哪里可以找到需要测试的端点,并且很容易让Docker Compose使用主映像将两个一个容器,以及另一个使用集成测试的容器image,并设置环境变量,以便测试套件知道要测试的内容。

答案 4 :(得分:0)

我曾尝试按照@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 -