多阶段Dockerfile创建非root用户报错 解决Twistlock合规漏洞求助
问题排查与修复方案
你遇到的报错为典型的非root用户运行Nginx时的权限不足问题,核心触发原因如下:
- Nginx默认需要向
/var/cache/nginx、/var/run目录写入缓存、PID文件,上述目录默认仅root用户拥有写入权限 - 若你的Nginx配置仍监听1024以下端口(默认80),非root用户无权限绑定低端口
- 站点目录
/usr/share/nginx/html、entrypoint.sh执行文件的归属仍为root,非root用户无读取/执行权限
具体修复步骤
- 先修改本地Nginx站点配置
src/nginx/default.conf,将默认监听端口listen 80;调整为listen 8080;,使用1024以上的端口允许非root用户绑定 - 调整Dockerfile中Webserver阶段的权限配置,修改后完整的Webserver阶段代码如下:
# Webserver FROM nginx:1.17.10-alpine USER root # Upgrade the system RUN apk update && apk upgrade && apk add bash # 新增非root用户创建与权限配置 RUN addgroup -S appgroup && adduser -S appuser -G appgroup \ # 授权Nginx运行所需的可写目录 && chown -R appuser:appgroup /var/cache/nginx /var/run \ # 授权站点文件目录 && chown -R appuser:appgroup /usr/share/nginx/html # copy the configuration for nginx COPY /src/nginx/nginx.conf /etc/nginx/ COPY /src/nginx/default.conf /etc/nginx/conf.d/ # delete the previous content RUN rm -rf /usr/share/nginx/html/* COPY --from=build /usr/src/app/dist/myapp /usr/share/nginx/html # 修改config.json归属为非root用户 COPY --chown=appuser:appgroup --from=build /usr/src/app/dist/myapp/config.json /usr/share/nginx/html/config.json RUN chmod 644 /usr/share/nginx/html/config.json # 修改entrypoint.sh归属与执行权限 COPY --chown=appuser:appgroup entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # 切换为非root用户运行 USER appuser ENTRYPOINT ["sh", "/entrypoint.sh"] COPY --from=build /usr/src/app/.scannerwork /usr/.scannerwork EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"]
额外注意事项
- 若你的
nginx.conf主配置中存在user nginx;配置行,请删除该行,否则非root用户运行时会因无法切换用户报错 - 如仍出现PID文件写入报错,可调整启动命令为
CMD ["nginx", "-g", "pid /tmp/nginx.pid; daemon off;"],指定PID文件写入到所有用户都有权限的/tmp目录
内容的提问来源于stack exchange,提问作者Cristhian Cabrera Cerna
相关产品推荐
相关产品推荐

