我曾经列出该tests
目录,.dockerignore
以便它不会被包含在用于运行Web服务的映像中。
现在,我尝试使用Docker运行我的单元测试,在这种情况下,我希望tests
包含该目录。
我已经检查docker build -h
并发现没有相关的选项。
我怎样才能做到这一点?
Answers:
Docker 19.03为此提供了一个解决方案。
Docker客户端尝试首先加载
<dockerfile-name>.dockerignore
,然后.dockerignore
在找不到时回退。因此,docker build -f Dockerfile.foo .
首先尝试加载Dockerfile.foo.dockerignore
。
DOCKER_BUILDKIT=1
要使用此功能,当前需要设置环境变量。docker compose
从1.25.0-rc3开始,也可以通过指定COMPOSE_DOCKER_CLI_BUILD=1
来使用此标志。
也可以看看:
dockerignore
应在同一目录中Dockerfile
,而不是在根上下文目录和原来一样.dockerignore
../foo
?)
# syntax = docker/dockerfile:1.0-experimental
目前,尚无办法。关于--ignore
在Docker上添加标志以提供要使用的忽略文件,已经进行了很长时间的讨论-请在此处查看。
您目前所拥有的选择大多很难看:
Dockerfile
和的子目录.dockerignore
,这可能不适用于您的情况。.docker_ignore
根据需要将其移至名称中。
另一个选择是拥有包含测试的进一步构建过程。我这样做的方式是这样的:
如果测试是单元测试,那么我将创建一个从主项目映像派生的新Docker映像;我只是坚持一个FROM
在顶部,然后ADD
测试,以及任何所需的工具(在我的情况,mocha
,chai
等)。现在,此新的“测试”映像同时包含测试和要测试的原始源。然后,可以直接按原样运行它,也可以将其卷映射到主机上的源目录和测试目录以“监视模式”运行。
如果测试是集成测试(例如主映像可能是GraphQL服务器),那么我创建的映像是独立的,即不是从主映像派生的(当然,它仍然包含测试和工具) )。我的测试中使用环境变量,告诉他们在哪里可以找到端点需要测试,这是很容易得到多克尔撰写带来了既利用主要图像的容器,并使用集成测试图像的另一容器,设置环境变量这样测试套件就知道要测试什么。
我曾尝试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 -