我正在尝试为.NET Core单元测试项目创建Docker映像,因此我可以在Linux环境(因为这是我的应用程序的部署环境)中而不是Windows开发环境中运行单元测试。解决方案的结构是这样的:
MySolution
|
|--MyApp
|
|--MyLib
|
|--UnitTests
UnitTests
引用MyApp
,而MyApp
引用MyLib
。因此,我在UnitTests
项目中创建了一个Dockerfile:
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY UnitTests.csproj UnitTests/
COPY *.config UnitTests/
COPY appsettings.json UnitTests/
COPY ../MyApp/MyApp.csproj MyApp/
COPY ../MyLib/MyLib.csproj MyLib/
WORKDIR /src/UnitTests
RUN dotnet restore -nowarn:msb3202,nu1503
RUN dotnet build UnitTests.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish UnitTests.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["tail", "-f", "/dev/null"]
但是当我尝试构建图像时:
docker build --pull -t unittests .
当我尝试复制MyApp
时出现问题,并且失败
复制失败:构建上下文之外的禁止路径:../MyApp/MyApp.csproj()
我不能将Dockerfile放在根目录中,因为这适用于解决方案;它专门用于我的单元测试。那么我应该如何在Dockerfile中包含项目的依赖项?
答案 0 :(得分:1)
一种解决方法是将Dockerfile
放在UnitTests目录中,但是从父目录中调用Docker,并指定dockerfile的路径:
docker build --pull -t unittests --file UnitTest/Dockerfile .
然后,您需要调整dockerfile中的一些路径:
FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY /UnitTests/UnitTests.csproj UnitTests/
COPY /UnitTests/*.config UnitTests/
COPY /UnitTests/appsettings.json UnitTests/
COPY /MyApp/MyApp.csproj MyApp/
COPY /MyLib/MyLib.csproj MyLib/
WORKDIR /src/UnitTests
RUN dotnet restore -nowarn:msb3202,nu1503
RUN dotnet build UnitTests.csproj -c Release -o /app
FROM build AS publish
RUN dotnet publish UnitTests.csproj -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["tail", "-f", "/dev/null"]
另一种处理方法是在根目录中包含多个dockerfile:
Dockerfile <-- "Main" dockerfile for the build of the product
Dockerfile.UnitTests <!-- Unit test dockerfile
另一种解决方法是将单元测试集成到“主” Dockerfile中。这样做的好处是,只要构建主映像,单元测试就会自动运行-无需单独构建。