我正在使用Docker运行单元测试,生成Cobertura代码覆盖率结果,然后就此生成HTML报告(使用ReportGenerator)。然后,我将代码覆盖结果文件和HTML报告都发布到VSTS DevOps。
以下是我需要运行的命令:
# Generates coverage.cobertura.xml for use in the next step.
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=codecoveragereports/
# Generates HTML reports from coverage.cobertura.xml file.
dotnet reportgenerator -reports:app/test/MyApplication.UnitTests/codecoveragereports/coverage.cobertura.xml -targetdir:codecoveragereports -reportTypes:htmlInline
现在在dockerfile中:
WORKDIR ./app/test/MyApplication.UnitTests/
RUN dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=codecoveragereports/
ENTRYPOINT ["/bin/bash", "-c", "dotnet reportgenerator -reports:codecoveragereports/*.xml -targetdir:codecoveragereports -reportTypes:htmlInline"]
并构建图像:
docker build -t myapplication.tests -f dockerfile --target tester .
并运行它:
docker run --rm -it -v $PWD/codecoveragereports:/app/test/MyApplication.UnitTests/codecoveragereports myapplication.tests:latest
问题:
在dotnet test
上生成的结果文件确实生成了(我可以使用RUN dir
进行测试),但是当我在{{1上指定一个卷(使用-v
)时似乎消失了}}。
是否无法在docker run
期间在映像中生成的文件上创建卷?
答案 0 :(得分:1)
您的容器的寿命可以大致表示为
docker build
docker run -v
$PWD/codecoveragereports
到codecoveragereports
,这掩盖了之前的codecoveragereports
因此,您需要将dot test
输出到临时文件夹,然后在运行时将其复制到安装点(在入口点)。
dockerfile
COPY init.sh /
dot test --> /temp/
ENTRYPOINT ['/bin/bash', '/init.sh']
init.sh
cp /temp /app/test/MyApplication.UnitTests/codecoveragereports
exec ["/bin/bash", "-c", "dotnet reportgenerator -reports:codecoveragereports/*.xml -targetdir:codecoveragereports -reportTypes:htmlInline"]