vah*_*ari 4 asp.net-core testcontainers
我使用Testcontainers.MsSql 3.0.0在 asp.net 项目中进行集成测试。集成测试在 Visual Studio 测试运行器中成功运行。但是当我通过 docker build 命令在docker 桌面版本 20.10.7中运行测试时,出现错误:
\n\n\n自动发现未检测到 Docker 主机配置无法\n检测 Docker 终结点。使用环境变量或 ~/.testcontainers.properties 文件来自定义配置\n
\n
这是container\xe2\x80\x99s创建代码:
\nVar dbContainer\n = new MsSqlBuilder()\n .WithImage(imageName)\n .WithCleanUp(true)\n .Build();\nRun Code Online (Sandbox Code Playgroud)\n这是我的 docker 文件:
\nFROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env\n\nARG buildVersion\n\nWORKDIR /app\nCOPY . ./\n\nRUN dotnet restore ./Test.sln\n\nRUN dotnet test ./Test.sln /p:CollectCoverage=true \n\nRUN dotnet publish ./Test/ -c Release -o out\n\nFROM mcr.microsoft.com/dotnet/aspnet:7.0\n\nWORKDIR /app\nCOPY --from=build-env /app/out .\n\nENV TZ=Asia/Tehran\nRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone\nRUN dpkg-reconfigure -f noninteractive tzdata\n\nEXPOSE 80 80/tcp\n\nENTRYPOINT ["dotnet", "Test.dll"]\nRun Code Online (Sandbox Code Playgroud)\n我在 github 上搜索,但解决方案对我不起作用。例如,我尝试使用 docker-compose 但它没有 \xe2\x80\x99t 工作:
\n version: "3"\nservices:\n docker_compose_test:\n build:\n dockerfile: Dockerfile\n context: .\n entrypoint: dotnet\n command: test\n environment:\n - TESTCONTAINERS_HOST_OVERRIDE=host.docker.internal\n volumes:\n - $PWD:$PWD\n - /var/run/docker.sock:/var/run/docker.sock\nRun Code Online (Sandbox Code Playgroud)\n这是我的完整源代码。
\n我有同样的问题。我希望能给你一些信息来解决这个问题。
\n如果您尝试使用命令构建 docker 映像docker build -t my-image-name .,您会注意到构建过程在 处失败dotnet test。
失败的原因是 TestContainer 正在尝试运行第二个 Docker 容器,但无法与 Dockerd 通信。
\n如果您查看某些网站(甚至TestContainer dind 文档),他们建议添加卷-v /var/run/docker.sock:/var/run/docker.sock,正如您在发布的 docker compose 中找到的那样。
请注意,此解决方案仅在您运行dotnet testa 时才有效docker run,因为在 a 期间无法添加外部卷docker build。
如果您尝试运行 docker-compose up,也会出现同样的问题。您的 docker-compose 有一个构建部分,它表示从您创建的 dockerfile 构建一个容器,并且它会如上所述崩溃。
\n为什么使用 VS testrunner 运行测试时它可以工作?它之所以有效,是因为您的 testrunner 正在dotnet testdockerd 已经存在的环境中运行。
我们可以看到问题是在 docker 构建过程中执行 dotnet test。我们必须在它之后执行。
\n多阶段 dockerfile 可以帮助我们。以这个 dockerfile 为例:
\nFROM mcr.microsoft.com/dotnet/sdk:6.0 AS base\nWORKDIR /App\n\nCOPY . ./\nRUN dotnet restore\nRUN dotnet build\n\nFROM base as test\nCMD [ "dotnet", "test" ]\n\n# multiple stages (like publish and so on)\nRun Code Online (Sandbox Code Playgroud)\n该 dockerfile 声明了至少 2 个阶段:基础阶段和测试阶段。
\n请注意,它dotnet test 不再在构建过程中运行,而是在测试阶段运行容器时作为命令运行。
执行命令:
\ndocker build -t my-image-name --target test .创建您的应用程序的映像test stage
现在执行命令:
\ndocker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock --name my-container-name my-image-name
Voil \xc3\xa0您的测试正在运行,并且 TestContainer 能够运行另一个 docker 容器!
\n然后您可以继续执行以下命令构建整个图像:
\ndocker build -t my-image-name .
Docker Compose 的解决方案可能如下:
\n这是一个基于上面 dockerfile 的示例。当且仅当从我的 dockerfile 构建的容器(用于运行 dotnet 测试)成功完成时,我的 docker-compose.yml 才会运行容器“docker_hello_world”。
\nversion: "3.8"\nservices:\n docker_hello_world:\n image: hello-world\n depends_on:\n docker_compose_test:\n condition: service_completed_successfully\n docker_compose_test:\n build:\n dockerfile: Dockerfile\n context: .\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\nRun Code Online (Sandbox Code Playgroud)\n最后你将需要
\ndotnet test。我希望我能以某种方式帮助你。如果您需要更多信息,请告诉我。
\n一些参考资料:
\nhttps://dotnet.testcontainers.org/examples/dind/
\nhttps://docs.docker.com/build/building/multi-stage/
\nhttps://docs.docker.com/language/java/run-tests/
\nhttps://docs.docker.com/compose/startup-order/
\n| 归档时间: |
|
| 查看次数: |
2093 次 |
| 最近记录: |