我曾经在.dockerignore中列出tests目录,这样它就不会包含在我用来运行Web服务的映像中。现在,我尝试使用Docker来运行单元测试,在本例中,我希望包含tests目录。我检查了docker build -h,没有发现相关的选项。我该怎么做?
.dockerignore
tests
docker build -h
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一样位于根上下文目录中也就是说呼叫时
<dockerfile-name>.dockerignore
docker build -f Dockerfile.foo .
Dockerfile.foo.dockerignore
DOCKER_BUILDKIT=1
docker compose
COMPOSE_DOCKER_CLI_BUILD=1
插接器_构建套件=1
docker构建-f /路径/到/custom.Dockerfile...您的.dockerignore文件应该位于/路径/到/custom.Dockerfile.停靠忽略
custom.Dockerfile
oalqel3c2#
目前,还没有办法做到这一点。有一个冗长的讨论关于添加一个--ignore标志到Docker,以提供忽略文件使用-请参阅here。你目前的选择大多是丑陋的:
--ignore
Dockerfile
suzh9iv83#
在这里可以选择将清理过的测试作为卷装载添加到容器中。在构建映像后,如果运行它进行测试,请将包含测试的源代码装载到清理过的代码之上。
services: tests: image: my-clean-image volumes: - '../app:/opt/app' # Add removed tests
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 -个
DOCKER_BUILDKIT
tar -czh -T files-to-include.txt | docker build -f path/to/Dockerfile -
nxowjjhe5#
另一个选择是有一个进一步的构建过程,其中包括测试。我这样做:如果测试是 * 单元测试 *,那么我创建一个新的Docker映像,它是从主项目映像派生的;我只是在顶部粘贴一个FROM,然后粘贴ADD测试,以及任何所需的工具(在我的例子中,mocha,chai等)。这个新的“测试”映像现在包含 * 测试和要测试的原始源代码。然后,它可以简单地按原样运行,也可以在“监视模式”下运行卷Map到主机上的源目录和测试目录。如果测试是 * 集成测试 *(例如,主映像可能是GraphQL服务器),则我创建的映像是自包含的,即不是从主映像派生的(当然,它仍然包含测试和工具)我的测试使用环境变量来告诉他们在哪里可以找到需要测试的端点,并且很容易让DockerCompose启动一个使用主映像的容器和另一个使用集成测试映像的容器,并设置环境变量,以便测试套件知道要测试什么。
FROM
ADD
mocha
chai
ppcbkaq56#
遗憾的是,目前还不能指向用于.dockerignore的特定文件,所以我们在构建脚本中基于target/platform/image生成它。作为一个Docker爱好者,这是一个可悲而尴尬的解决方案。
6条答案
按热度按时间svdrlsy41#
Docker 19.03为此提供了一个解决方案。
Docker客户端首先尝试加载
<dockerfile-name>.dockerignore
,如果找不到,福尔斯到.dockerignore
。因此,docker build -f Dockerfile.foo .
首先尝试加载Dockerfile.foo.dockerignore
。当前需要设置
DOCKER_BUILDKIT=1
环境变量才能使用此功能。此标志可以与docker compose
一起使用,自also specifyingCOMPOSE_DOCKER_CLI_BUILD=1
的1.25.0-rc 3起。另请参阅注解0、注解1、注解2
来自Mugen的评论,请注意
自定义dockerignore应该与Dockerfile位于同一目录中,而不是像原始的.dockerignore一样位于根上下文目录中
也就是说
呼叫时
插接器_构建套件=1
docker构建-f /路径/到/
custom.Dockerfile
...您的
.dockerignore
文件应该位于/路径/到/
custom.Dockerfile
.停靠忽略oalqel3c2#
目前,还没有办法做到这一点。有一个冗长的讨论关于添加一个
--ignore
标志到Docker,以提供忽略文件使用-请参阅here。你目前的选择大多是丑陋的:
Dockerfile
和.dockerignore
,这在您的情况下可能不起作用。suzh9iv83#
在这里可以选择将清理过的测试作为卷装载添加到容器中。在构建映像后,如果运行它进行测试,请将包含测试的源代码装载到清理过的代码之上。
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 -
个nxowjjhe5#
另一个选择是有一个进一步的构建过程,其中包括测试。我这样做:
如果测试是 * 单元测试 *,那么我创建一个新的Docker映像,它是从主项目映像派生的;我只是在顶部粘贴一个
FROM
,然后粘贴ADD
测试,以及任何所需的工具(在我的例子中,mocha
,chai
等)。这个新的“测试”映像现在包含 * 测试和要测试的原始源代码。然后,它可以简单地按原样运行,也可以在“监视模式”下运行卷Map到主机上的源目录和测试目录。如果测试是 * 集成测试 *(例如,主映像可能是GraphQL服务器),则我创建的映像是自包含的,即不是从主映像派生的(当然,它仍然包含测试和工具)我的测试使用环境变量来告诉他们在哪里可以找到需要测试的端点,并且很容易让DockerCompose启动一个使用主映像的容器和另一个使用集成测试映像的容器,并设置环境变量,以便测试套件知道要测试什么。
ppcbkaq56#
遗憾的是,目前还不能指向用于
.dockerignore
的特定文件,所以我们在构建脚本中基于target/platform/image生成它。作为一个Docker爱好者,这是一个可悲而尴尬的解决方案。