Fra*_*cis 17 unit-testing dockerfile asp.net-core-2.0
我正在构建一个.NET Core 2.0 Web API,我正在创建一个Docker镜像.我对Docker很陌生,如果之前已经回答了这个问题,那么道歉.
我有以下Docker文件来创建图像.特别是,我在构建过程中运行单元测试,并将结果输出到./test/test_results.xml(在构建期间创建的临时容器中,我猜).我的问题是,如何在构建完成后访问这些测试结果?
FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app
# Copy main csproj file for DataService
COPY src/DataService.csproj ./src/
RUN dotnet restore ./src/DataService.csproj
# Copy test csproj file for DataService
COPY test/DataService.Tests.csproj ./test/
RUN dotnet restore ./test/DataService.Tests.csproj
# Copy everything else (excluding elements in dockerignore)
COPY . ./
# Run the unit tests
RUN dotnet test --results-directory ./ --logger "trx;LogFileName=test_results.xml" ./test/DataService.Tests.csproj
# Publish the app to the out directory
RUN dotnet publish ./src/DataService.csproj -c Release -o out
# Build the runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
EXPOSE 5001
COPY --from=build-env /app/src/out .
# Copy test results to the final image as well??
# COPY --from=build-env /app/test/test_results.xml .
ENTRYPOINT ["dotnet", "DataService.dll"]
Run Code Online (Sandbox Code Playgroud)
我采取的一种方法是评论该行# COPY --from=build-env /app/test/test_results.xml ..这就是test_results.xml我的最终形象.然后,我可以test_results.xml使用以下powershell脚本提取这些结果并从最终图像中删除.
$id=$(docker create dataservice)
docker cp ${id}:app/test_results.xml ./test/test_results.xml
docker start $id
docker exec $id rm -rf /app/test_results.xml
docker commit $id dataservice
docker rm -vf $id
Run Code Online (Sandbox Code Playgroud)
然而这看起来很难看,我想知道是否有更清洁的方法.
我希望有一种方法来安装一个卷,docker build但看起来这似乎不会在官方Docker中得到支持.
我现在正在寻找创建一个单独的图像,仅用于单元测试.
不确定是否有推荐的方式来实现我想要的.
谢谢你的问题 - 我需要解决同样的问题。
我根据构建结果添加了一个单独的容器阶段。测试及其输出都在那里处理,因此它们永远不会到达最终容器。所以 build-env 用于构建,然后中间测试容器基于该 build-env 映像,final 基于运行时容器,其中复制了 build-env 的结果。
# ---- Test ----
# run tests and capture results for later use. This use the results of the build stage
FROM build AS test
#Use label so we can later obtain this container from the multi-stage build
LABEL test=true
WORKDIR /
#Store test results in a file that we will later extract
RUN dotnet test --results-directory ../../TestResults/ --logger "trx;LogFileName=test_results.xml" "./src/ProjectNameTests/ProjectNameTests.csproj"
Run Code Online (Sandbox Code Playgroud)
我添加了一个 shell 脚本作为下一步,然后将图像标记为 project-test。
#!bin/bash
id=`docker images --filter "label=test=true" -q`
docker tag $id projectname-test:latest
Run Code Online (Sandbox Code Playgroud)
在那之后,我基本上做你做的事情,即使用 docker cp 并将文件取出。不同之处在于我的测试结果从未出现在最终图像中,所以我不会触摸最终图像。
总的来说,我认为处理测试的正确方法可能是创建一个测试映像(基于构建映像)并使用已安装的卷运行它以获得测试结果,并在该容器启动时运行单元测试。拥有适当的图像/容器还可以让您运行集成测试等。本文较旧,但详细信息类似https://blogs.infosupport.com/build-deploy-test-aspnetcore-docker-linux-tfs2015/
| 归档时间: |
|
| 查看次数: |
2957 次 |
| 最近记录: |