编写 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/
「点点赞赏,手留余香」
声明:本文为原创文章,版权归旷野小站所有,欢迎分享本文,转载请保留出处!