You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:33:18