我曾在tests
列出.dockerignore
目录,因此它不会包含在我用来运行网络服务的图片中。
现在我正在尝试使用Docker来运行我的单元测试,在这种情况下,我希望包含tests
目录。
我检查了docker build -h
,发现没有选项相关。
我该怎么做?
答案 0 :(得分:16)
Docker 19.03为此提供了一个解决方案。
Docker客户端首先尝试加载
<dockerfile-name>.dockerignore
,然后在找不到时退回到.dockerignore
。因此,docker build -f Dockerfile.foo .
首先尝试加载Dockerfile.foo.dockerignore
。
当前需要设置DOCKER_BUILDKIT=1
环境变量才能使用此功能。自1.25.0-rc3起also specifying COMPOSE_DOCKER_CLI_BUILD=1
以来,此标志可与docker compose
一起使用。
另请参阅:
答案 1 :(得分:13)
目前,没有办法做到这一点。关于向Docker添加--ignore
标志以提供要使用的忽略文件的讨论很长 - 请参阅here。
您目前的选择大多是丑陋的:
Dockerfile
和.dockerignore
,这可能不适用于您的情况。答案 2 :(得分:2)
将清理后的测试作为卷装入添加到容器中可以是一个选项。构建映像后,如果运行它进行测试,请在清理后的代码之上安装包含测试的源代码。
services:
tests:
image: my-clean-image
volumes:
- '../app:/opt/app' # Add removed tests
答案 3 :(得分:0)
另一个选择是进一步构建包含测试的构建过程。我这样做是这样的:
如果测试是单元测试,那么我创建一个从主项目图像派生的新Docker镜像;我只是将FROM
放在顶部,然后ADD
测试,加上任何必需的工具(在我的情况下,mocha
,chai
等等)。这个新的“测试”图像现在包含两个测试和要测试的原始源。它可以简单地按原样运行,也可以在“监视模式”下运行,并将卷映射到主机上的源和测试目录。
如果测试是集成测试 - 例如主映像可能是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 -