如何为引用兄弟目录的项目构建Dockerfile?

时间:2018-10-08 11:48:22

标签: docker .net-core

我正在尝试为.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中包含项目的依赖项?

1 个答案:

答案 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中。这样做的好处是,只要构建主映像,单元测试就会自动运行-无需单独构建。