使用UBI8 .NET 8镜像执行dotnet restore时遇权限问题求助
解决UBI8 .NET 8镜像中dotnet restore的权限拒绝问题
问题重现
使用registry.access.redhat.com/ubi8/dotnet-80:8.0-5作为基础镜像构建.NET Web API时,执行dotnet restore报错:
11.56 /usr/lib64/dotnet/sdk/8.0.103/NuGet.targets(156,5): error : Access to the path '/src/WebApiPoc/obj' is denied. [/src/WebApiPoc/webapipoc.csproj]
11.56 /usr/lib64/dotnet/sdk/8.0.103/NuGet.targets(156,5): error : Permission denied [/src/WebApiPoc/webapipoc.csproj]
原Dockerfile尝试通过chown和chmod调整权限但未解决问题,核心原因是COPY操作后生成的文件/目录仍为root所有,非root用户1001无写入权限。
解决方案
方案一:非root用户全程构建(符合安全规范)
修改Dockerfile,调整操作顺序确保非root用户对工作目录拥有完整权限:
FROM registry.access.redhat.com/ubi8/dotnet-80:8.0-5 AS base WORKDIR /app EXPOSE 5164 ENV ASPNETCORE_URLS=http://+:5164 FROM --platform=$BUILDPLATFORM registry.access.redhat.com/ubi8/dotnet-80:8.0-5 AS build ARG configuration=Release # 以root用户预先创建目录并配置权限 WORKDIR /src RUN mkdir -p WebApiPoc RUN chown -R 1001:0 /src RUN chmod -R g+rwX /src # 切换到非root用户执行构建 USER 1001 COPY ["WebApiPoc/webapipoc.csproj", "WebApiPoc/"] RUN dotnet restore "WebApiPoc/webapipoc.csproj" COPY . . WORKDIR "/src/WebApiPoc" RUN dotnet build "webapipoc.csproj" -c $configuration -o /app/build FROM build AS publish ARG configuration=Release RUN dotnet publish "webapipoc.csproj" -c $configuration -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 运行阶段切换到非root用户 USER 1001 ENTRYPOINT ["dotnet", "webapipoc.dll"]
修改说明
- 提前创建项目子目录,通过
chown -R 1001:0 /src将目录所有者设为1001用户、所属组设为root组,再用chmod -R g+rwX /src赋予组读写执行权限,确保非root用户能正常写入。 - 最终运行阶段切换非root用户,符合Red Hat UBI镜像的安全最佳实践。
方案二:root用户构建+非root用户运行(简化操作)
若无需严格遵循非root构建流程,可暂时以root用户完成restore和build,仅在运行阶段切换非root用户:
FROM registry.access.redhat.com/ubi8/dotnet-80:8.0-5 AS base WORKDIR /app EXPOSE 5164 ENV ASPNETCORE_URLS=http://+:5164 FROM --platform=$BUILDPLATFORM registry.access.redhat.com/ubi8/dotnet-80:8.0-5 AS build ARG configuration=Release WORKDIR /src COPY ["WebApiPoc/webapipoc.csproj", "WebApiPoc/"] RUN dotnet restore "WebApiPoc/webapipoc.csproj" COPY . . WORKDIR "/src/WebApiPoc" RUN dotnet build "webapipoc.csproj" -c $configuration -o /app/build FROM build AS publish ARG configuration=Release RUN dotnet publish "webapipoc.csproj" -c $configuration -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . # 调整运行目录权限并切换用户 RUN chown -R 1001:0 /app && chmod -R g+rwX /app USER 1001 ENTRYPOINT ["dotnet", "webapipoc.dll"]
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

