首页 > 解决方案 > 修改映像以使用除 root [.net core] 以外的用户运行

问题描述

我们使用漏洞工具扫描了我们的图像,我们收到了这条消息“修改图像以使用非 root 用户运行”

我们尝试了几件事,创建目录,创建用户并将用户设置为新用户。根据我们尝试的“解决方案”,我们会遇到几个错误,如有必要,我很乐意分享。我开始意识到我们的 dockerfile 存在一个更基本的问题

码头工人文件

1. FROM mcr.microsoft.com/dotnet/sdk:5.0-focal as build
2. 
3. ENV APP_USER app_user
4. ENV HOME /home/$APP_USER
5. RUN useradd -r $APP_USER
6. 
7. RUN mkdir -p $HOME/src
8. WORKDIR $HOME/src
9. 
10. COPY "./nuget.config" ./
11. COPY "./Directory.Build.props" ./
12. COPY "./src/Services/BookStore/" .
13. 
14. USER root
15. RUN chown -R $APP_USER $HOME/src
16. 
17. # Set user name to run container
18. USER $APP_USER
19. WORKDIR ./BookStore.Api
20. RUN dotnet build "BookStore.Api.csproj"
21. 
22. EXPOSE 80
23. ENTRYPOINT ["dotnet", "run", "--urls", "http://0.0.0.0:80"]
24. 
25. FROM build AS publish
26. RUN dotnet publish "BookStore.Api.csproj" -c Release -o /app/publish
27. WORKDIR /app/publish
28. RUN rm -f *.pdb && rm -f *Development*.* && rm -f nuget.config
29. 
30. FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS release
31. WORKDIR /app
32. COPY --from=publish /app/publish .
33. EXPOSE 80
34. ENTRYPOINT ["dotnet", "BookStore.Api.dll", "--urls", "http://0.0.0.0:80"]

错误:

NuGet.targets(565,5):错误:无法获得对“/home/app_user/src/nuget.config”操作的“/tmp/NuGetScratch/lock/6d5da057f9063f4d1ecd1b43e767d61dce14616c”上的锁定文件访问权限。这可能意味着其他用户或管理员持有此锁,并且此进程无权访问它。如果当前没有其他进程对此文件执行操作,则可能意味着早期的 NuGet 进程崩溃并留下无法访问的锁定文件,在这种情况下,删除文件 '/tmp/NuGetScratch/lock/6d5da057f9063f4d1ecd1b43e767d61dce14616c' 将允许 NuGet 继续

我尝试了更多修复,在 SO 和 github 帖子上找到,但没有任何运气我错过了什么?

标签: c#docker.net-core

解决方案


您需要将用户创建和USER指令添加到结果图像(发布),而不是构建图像。例如,第 31 行(之后WORKDIR),您将创建用户并设置容器用户,然后您的应用程序将在非 root 用户权限下运行。

就像是:

#...

FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS release
WORKDIR /app
ENV APP_USER app_user
RUN useradd -r $APP_USER
USER $APP_USER
COPY --from=publish /app/publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "BookStore.Api.dll", "--urls", "http://0.0.0.0:80"]

推荐阅读