我试图将我的asp.net-core应用程序包含在Docker容器中。当我使用Microsoft秘密存储来保存凭据时,我需要在容器中运行dotnet user-secrets命令。应用程序在启动时需要读取这些凭据,因此我必须在启动应用程序之前运行命令。尝试在Dockerfile中执行此操作时,出现错误:
---> Running in 90f974a06d83
Could not find a MSBuild project file in '/app'. Specify which project to use with the --project option.
我尝试先构建我的应用程序,然后使用已经构建的dll构建一个容器,但这给了我同样的错误。我还尝试使用ENTRYPOINT [“ / bin / bash”]连接到容器,然后在容器中环顾四周。似乎创建的/ app文件夹不包含.csproj文件。我不确定这是否可能是错误。
我的Dockerfile
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["Joinme.Facade/Joinme.Facade.csproj", "Joinme.Facade/"]
COPY ["Joinme.Domain/Joinme.Domain.csproj", "Joinme.Domain/"]
COPY ["Joinme.Business/Joinme.Business.csproj", "Joinme.Business/"]
COPY ["Joinme.Persistence/Joinme.Persistence.csproj", "Joinme.Persistence/"]
COPY ["Joinme.Integration/Joinme.Integration.csproj", "Joinme.Integration/"]
RUN dotnet restore "Joinme.Facade/Joinme.Facade.csproj"
COPY . .
WORKDIR "/src/Joinme.Facade"
RUN dotnet build "Joinme.Facade.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "Joinme.Facade.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
RUN dotnet user-secrets set "jwt:secret" "some_password"
ENTRYPOINT ["dotnet", "Joinme.Facade.dll"]
我的预期结果是机密已设置,因此我可以启动容器而不会崩溃。
答案 0 :(得分:2)
简单明了:操作失败,因为在此阶段,没有*.csproj
命令需要的user-secrets
文件。但是,出于以下几个原因,这不是您应该做的事情:
用户机密不用于生产。您可以轻松地或实际上 more 轻松地在此处设置环境变量,而不需要dotnet
或SDK。
ENV jwt:secret some_password
您实际上不应该在Dockerfile中存储机密,因为这会进入源代码控制,并以纯文本形式公开。使用Docker secrets或外部提供程序,例如Azure Key Vault。
无论如何,您都不想基于SDK构建最终图像。这将使您的容器映像巨大,这意味着到/从容器注册表的传输时间更长,以及存储/带宽成本更高。如果发布的是自包含文件(即,使其尽可能小),则最终映像应基于运行时,甚至应基于alpine。