ky818smKy818sm  2025-11-16 10:02 旷野小站 隐藏边栏 |   抢沙发  4 
文章评分 0 次,平均分 0.0

编写 Dockerfile

下面是Dockerfile的内容,它基于官方Alpine镜像,创建了一个UID和GID为1000的openresty用户。

# 使用官方Alpine镜像以减小体积
FROM openresty/openresty:alpine

# 创建非root用户和组,并指定UID和GID为1000
RUN addgroup -g 1000 -S openresty && \
    adduser -u 1000 -S openresty -G openresty

# 创建必要的Nginx运行时目录并设置权限
RUN mkdir -p /usr/local/openresty/nginx/{client_body_temp,proxy_temp,fastcgi_temp,uwsgi_temp,scgi_temp} && \
    chown -R openresty:openresty /usr/local/openresty/nginx

# 设置日志目录权限(挂载volume时生效)
RUN chown -R openresty:openresty /usr/local/openresty/nginx/logs

# 切换到openresty用户
USER openresty

# 暴露端口
EXPOSE 80 443

# 使用非daemon模式启动,这是容器工作的标准方式
CMD ["/usr/local/openresty/nginx/sbin/nginx", "-g", "daemon off;"]

调整Nginx配置文件

为了让Nginx以非root用户身份正常工作,你的nginx.conf中user指令需要匹配。你可以直接使用现有的配置,但请确保开头部分类似这样:

# 在nginx.conf的顶部
user  openresty;
worker_processes  auto;

error_log  /usr/local/openresty/nginx/logs/error.log notice;
pid        /tmp/nginx.pid; # 考虑使用/tmp以避免权限问题
events {
    worker_connections  1024;
}
...
http {
    ...
    # 确保pid文件在可写入的目录
    pid        /tmp/nginx.pid;
    ...
}

关键点:如果你的配置中之前有user nobody;或其他用户,请将其改为user openresty;。另外,将PID文件路径改为/tmp/nginx.pid可以避免可能的权限问题。

构建与验证镜像


在包含Dockerfile的目录下,执行以下命令:
# 构建镜像,为其指定一个标签
docker build -t my-openresty:nonroot-1000 .

# 验证镜像是否成功创建
docker images | grep my-openresty

构建完成后,你可以运行一个临时容器来检查用户和权限:

# 检查用户openresty是否存在
docker run --rm my-openresty:nonroot-1000 id openresty
# 预期输出:uid=1000(openresty) gid=1000(openresty) groups=1000(openresty)

# 检查关键目录的权限
docker run --rm my-openresty:nonroot-1000 ls -la /usr/local/openresty/nginx/
声明:本站许多内容均从网上收集整理,若有内容侵犯到您的权益,请通过邮件【6167555@qq.com】联系本站,我们将及时删除!

有问题请点我联系站长

「点点赞赏,手留余香」
HIDE

声明:本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享