如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?
Posted
技术标签:
【中文标题】如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?【英文标题】:How to run an ASP.NET Core 3.1 project in a Docker container with Visual Studio 2019? 【发布时间】:2020-04-21 14:35:36 【问题描述】:我创建了一个基于 ASP.NET Core 3.1 框架的 Web API 项目。后来,我决定将它部署在 Linux 而不是 Windows VPS 上。在 Linux VPS 上部署应用程序之前,我希望能够在 Windows 7 上使用 Visual Studio 2019 在本地的 docker 容器中运行。
我在我的机器上安装了 docker toolbox for windows 以及 Oracle VM VirtualBox。
由于我的项目不是使用 Docker 支持创建的,所以我右键单击我的项目 >> 添加 >> “添加 Docker” 支持创建了 Dockerfile
。
现在,当我尝试在 Visual Studio 上构建/调试我的应用程序时,我收到以下错误
Error CTC1003 Visual Studio container tools require Docker to be running. ProjectName C:\Users\MyUsername\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.9.10\build\Container.targets 198
我通过单击“Docker Quickstart Terminal”启动了 Docker。我还能够验证default
virtual-box 是否正在运行。另外,我将“C_Drive”添加为默认 VM 上的共享文件夹。
如何使用 docker 正确启动/调试我的解决方案?
这里是我Dockerfile
的内容
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["ProjectName/ProjectName.csproj", "ProjectName/"]
RUN dotnet restore "ProjectName/ProjectName.csproj"
COPY . .
WORKDIR "/src/ProjectName"
RUN dotnet build "ProjectName.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ProjectName.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ProjectName.dll"]
我还尝试通过右键单击我的项目 >> 添加 >> 添加容器 Orchestraintor 支持来添加 docker-compose
支持 docker-compose
项目。
当我使用Docker Composer
运行应用程序时,应用程序运行时 Visual Studio 变为橙色以显示调试状态“并立即停止。以下是我在调试窗口中得到的结果
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
It was not possible to find any installed .NET Core SDKs
Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
https://aka.ms/dotnet-download
The target process exited without raising a CoreCLR started event. Ensure that the target process is configured to use .NET Core. This may be expected if the target process did not run on .NET Core.
The program 'dotnet' has exited with code 145 (0x91).
更新 1
这是 Visual Studio 在“构建”输出下打印的内容
1>------ Build started: Project: MyProject, Configuration: Debug Any CPU ------
1>MyProject -> C:\MyProjects\MyProject\MyProject\bin\Debug\netcoreapp3.1\MyProject.dll
1>docker run -dt -v "C:\Users\MyUsername\vsdbg\vs2017u5:/remote_debugger:rw" -v "C:\MyProjects\MyProject\MyProject:/app" -v "C:\MyProjects\MyProject:/src" -v "C:\Users\MyUsername\AppData\Roaming\Microsoft\UserSecrets:/root/.microsoft/usersecrets:ro" -v "C:\Users\MyUsername\AppData\Roaming\ASP.NET\Https:/root/.aspnet/https:ro" -v "C:\Users\MyUsername\.nuget\packages\:/root/.nuget/fallbackpackages2" -v "C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages" -e "DOTNET_USE_POLLING_FILE_WATCHER=1" -e "ASPNETCORE_ENVIRONMENT=Development" -e "ASPNETCORE_URLS=https://+:443;http://+:80" -e "NUGET_PACKAGES=/root/.nuget/fallbackpackages2" -e "NUGET_FALLBACK_PACKAGES=/root/.nuget/fallbackpackages;/root/.nuget/fallbackpackages2" -P --name MyProject --entrypoint tail myproject:dev -f /dev/null
1>docker: Error response from daemon: invalid mode: /root/.nuget/fallbackpackages.
1>See 'docker run --help'.
1>C:\Users\MyUsername\.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.9.10\build\Container.targets(198,5): error CTC1003: Visual Studio container tools require Docker to be running.
1>Done building project "MyProject.csproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
这是 VS 在“容器工具”输出下打印的内容
========== Checking for Container Prerequisites ==========
Verifying that Docker Desktop is installed...
Docker Desktop is installed.
========== Verifying that Docker Desktop is running... ==========
Verifying that Docker Desktop is running...
Visual Studio container tools require Docker to be running.
Docker Desktop is not running.
========== Finished ==========
更新 2
根据下面的Wiebe Tijsma
答案,我将我的docker-composer.yml
文件更新为以下内容
version: '3.4'
services:
myproject:
image: $DOCKER_REGISTRY-myproject
build:
context: .
dockerfile: MyProject/Dockerfile
volumes:
- photos:/app/Storage
volumes:
photos:
现在构建似乎运行良好,但运行失败。使用docker-composer
运行应用程序时,Visual Studio 会抛出此错误
启动失败,因为容器中的目录“/remote_debugger”为空。 这可能是由 Docker 使用的共享驱动器凭据引起的 台式机过时了。尝试重置共享中的凭据 Docker桌面设置的Drives页面,然后重启Docker
这是 Visual Studio 的最新构建输出
1>------ Build started: Project: MyProject, Configuration: Debug Any CPU ------
1>MyProject -> C:\MyProjects\MyProject\MyProject\bin\Debug\netcoreapp3.1\MyProject.dll
2>------ Build started: Project: docker-compose, Configuration: Debug Any CPU ------
2>docker-compose -f "C:\MyProjects\MyProject\docker-compose.yml" -f "C:\MyProjects\MyProject\docker-compose.override.yml" -f "C:\MyProjects\MyProject\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose15694150546677200279 --no-ansi up -d
2>Creating network "dockercompose15694150546677200279_default" with the default driver
2>Creating MyProject ...
2>Creating MyProject ... done
========== Build: 2 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
【问题讨论】:
@panoskarajohn 说明似乎是针对 VS Code 而不是 VS Studio。你有什么特别建议尝试的吗?我添加了调试图像,但在没有有用信息的情况下仍然出现相同的错误curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l /vsdbg
你能像docker run hello-world
一样启动其他docker容器吗?
@Isitar 是的,它显示 Hello from Docker! This message shows that your installation appears to be working correctly.
@John 有帮助 -> ***.com/questions/45869766/… ?
我假设您检查了C:\Users\MyUsername\vsdbg\vs2017u5
确实存在并且有足够的权限让 docker 服务用户访问它以进行读写?
【参考方案1】:
在我的情况下,发生错误是因为我还将一个卷映射到 /app,这导致入口点 + 所有 dotnet 发布的文件不可用(初学者错误:))。
myapp:
container_name: myapp
image: watch/myapp
volumes:
- ./testdata/:/app #<-- wrong
【讨论】:
这似乎有所改进,因为构建现在正在运行,但运行失败。请检查问题中Update 2
下的部分。我根据您的建议添加了添加音量的结果。
我也做了同样的事情,你只是让我免于将我的头撞到墙上
我猜必须更新 dockerfile 以适应卷:/app 路径?【参考方案2】:
您可以运行docker-compose
并像这样开始您的项目:
services:
xxxx.service:
image: $DOCKER_REGISTRYorderservice
build:
context: .
dockerfile: Dockerfile`
这里是docker-composer的位置
【讨论】:
我在创建docker-compose
文件的项目中添加了Container Orchestraintor 支持。该项目立即运行和停止。我在调试窗口中收到以下错误The target process exited without raising a CoreCLR started event. Ensure that the target process is configured to use .NET Core. This may be expected if the target process did not run on .NET Core. The program 'dotnet' has exited with code 145 (0x91).
查看你的dcoker镜像,清除本项目存在的镜像以上是关于如何使用 Visual Studio 2019 在 Docker 容器中运行 ASP.NET Core 3.1 项目?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Visual Studio 2019 进行 .NET Core 远程开发
如何在 Visual Studio 2019 中使用 git bash 终端配置文件?
如何在 Visual Studio 2019 和 .NET Core 3.0 中使用 ODBC 连接?
如何使用 Visual Studio 2019 构建最兼容的二进制文件?
如何使用 Visual Studio 2019 和 c++ 链接 OpenSSL 库?
如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证