我最终尝试在 Linux Docker 上运行基于 .NET 6 构建的 REST API。我的 VS 运行在 Windows 10 上,首先在 Windows Docker 桌面上进行测试。想法是在这里运行它并从 Linux docker 导入它。
这是我的 docker 文件。
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
#EXPOSE 80
#EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ./TTKDS.Web/TTKDS.Web.csproj ./TTKDS.Web/
COPY ./TTKDS.Infra/TTKDS.Infra.csproj ./TTKDS.Infra/
COPY ./TTKDS.Core/TTKDS.Core.csproj ./TTKDS.Core/
COPY . .
RUN dotnet restore ./TTKDS.Web/TTKDS.Web.csproj --disable-parallel
RUN dotnet build ./TTKDS.Web/TTKDS.Web.csproj -c Release -o /app/build
FROM build AS publish
RUN dotnet publish ./TTKDS.Web/TTKDS.Web.csproj -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE 7245
EXPOSE 7345
ENV ASPNETCORE_URLS=http://*:7245;https://*:7345
ENTRYPOINT ["dotnet", "TTKDS.Web.dll"]
现在,如果我只使用 http 运行它,如下所示。一切都很完美。
docker run --rm -p 7245:7245 -e ASPNETCORE_URLS=http://*:7245 ttkds.web:v1
我在 http://localhost:7245/api/Item/1 和使用 up 地址上都得到了简洁的响应。这告诉我我的 docker 文件和底层代码运行正常。
然后我就大胆地使用了https。遵循了这个教程。这是我按顺序执行的命令。
PS D:\Projects\TTKDS Core> dotnet dev-certs https --clean
Cleaning HTTPS development certificates from the machine. A prompt might get displayed to confirm the removal of some of the certificates.
HTTPS development certificates successfully removed from the machine.
PS D:\Projects\TTKDS Core> dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p demoapp
The HTTPS developer certificate was generated successfully.
PS D:\Projects\TTKDS Core> dotnet dev-certs https --trust
Trusting the HTTPS development certificate was requested. A confirmation prompt will be displayed if the certificate was not previously trusted. Click yes on the prompt to trust the certificate.
Successfully trusted the existing HTTPS certificate.
PS D:\Projects\TTKDS Core> dotnet user-secrets init -p .\TTKDS.Web\TTKDS.Web.csproj
The MSBuild project 'D:\Projects\TTKDS Core\.\TTKDS.Web\TTKDS.Web.csproj' has already been initialized with a UserSecretsId.
PS D:\Projects\TTKDS Core> dotnet user-secrets -p .\TTKDS.Web\TTKDS.Web.csproj set "Kestrel:Certificates:Development:Password" "demoapp"
Successfully saved Kestrel:Certificates:Development:Password = demoapp to the secret store.
现在我运行了 2 个不同的命令并收到了 2 个不同的错误!!
命令1
PS D:\Projects\TTKDS Core> docker run --rm -it -p 7245:7245 -p 7345:7345
-e ASPNETCORE_URLS="https://*:7345;http://*:7245"
-e ASPNETCORE_ENVIRONMENT=Development
-v $env:APPDATA\microsoft\UserSecrets\:/root/.microsoft/usersecrets
-v $env:USERPROFILE\.aspnet\https:/root/.aspnet/https/ ttkds.web:v1
未处理的异常。 System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期。
要生成开发人员证书,请运行“dotnet dev-certs https”。要信任证书(仅限 Windows 和 macOS),请运行“dotnet dev-certs https --trust”。
命令2:
PS D:\Projects\TTKDS Core> docker run --rm -p 7245:7245 -p 7345:7345
-e ASPNETCORE_URLS=https://localhost:7345
-e ASPNETCORE_Kestrel__Certificates__Default__Password=demoapp
-e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
-v C:\Users\BVSim\.aspnet\https:/https/ ttkds.web:v1
未处理的异常。
System.Security.Cryptography.CryptographicException:无法使用提供的密码读取证书数据,密码可能不正确。
System.Security.Cryptography.CryptographicException:无法使用提供的密码读取证书数据,密码可能不正确。
显然我错过了一些东西。我还不太熟悉 docker compose。你能告诉我我在这里做错了什么吗?
找到了!经过 18 小时不间断的谷歌搜索和观看无数的 YouTube 视频。最好的解决方案是从头开始。 Youtube 算法展示了这个视频,我一步步跟随。
这个问题的答案分两步:
我做的另一件事是让密码变得稍微复杂一些。我在某处偶然读到 Windows 不喜欢简单的密码!不确定这是否正确。
最后启动docker容器的命令是错误的。这是正确的命令。
PS D:\Projects\TTKDS Core> docker run --rm -p 7245:80 -p 7345:443
-e ASPNETCORE_URLS="https://+;http://+"
-e ASPNETCORE_Kestrel__Certificates__Default__Password=d3m04pp
-e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
-v $env:APPDATA\microsoft\UserSecrets\:/root/.microsoft/usersecrets
-v $env:USERPROFILE\.aspnet\https:/root/.aspnet/https/ ttkds.web:v1
现在我的 docker 镜像运行没有错误,并在端口 7345 上响应