首页 > 解决方案 > 在 docker 容器中运行 dotnet test

问题描述

我想dotnet test在 docker 容器中运行命令,但我无法弄清楚将命令放在哪里。该项目是一个 .NET Core 2.1 测试项目。这样做的原因是我想运行端到端的集成测试,这需要我的所有容器都在运行。

Docker文件:

FROM microsoft/dotnet:2.1-runtime AS base
WORKDIR /app

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY *.sln ./
COPY Sombra.IntegrationTests/Sombra.IntegrationTests.csproj Sombra.IntegrationTests/
COPY . .
WORKDIR /src/Sombra.IntegrationTests
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "test", "Sombra.IntegrationTests.csproj"]

码头工人-compose.yml

version: '3'

services:
  sombra.integrationtests:
    image: sombra.integrationtests
    build:
      context: .
      dockerfile: Sombra.IntegrationTests/Dockerfile
    depends_on:
      - rabbitmq

标签: docker.net-coredocker-compose

解决方案


您正在使用运行时映像来调用sdk命令测试。您的final来自basebase来自runtime

我已经成功地将单元测试用作构建容器的中间步骤,但从未使用 docker-compose 进行集成测试。关键区别在于我使用了RUN命令而不是命令,entrypoint/cmd因此在构建容器时测试已经在执行。主要优点是测试失败时没有最终图像。但话又说回来,这是纯粹的单元测试,没有集成测试。虽然我可以想象这也会起作用。

这是我的完整示例:

FROM microsoft/dotnet:2.0-sdk AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY test.sln ./test.sln
COPY program/program.csproj ./program/program.csproj
COPY program.tests/program.tests.csproj ./program.tests/program.tests.csproj
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet test program.tests -c Release
RUN dotnet publish program -c Release -o /app/out

# build runtime image
FROM microsoft/dotnet:2.0-runtime
WORKDIR /app
COPY --from=build-env /app/out ./
ENTRYPOINT ["dotnet", "program.dll"]

推荐阅读