Docker 构建时指定用户启动

解决 Docker 容器默认以 root 用户运行导致的权限问题,指定非 root 用户启动应用。

Docker运维Linux
Docker 构建时指定用户启动

前言

我们在 Linux 使用应用时,往往不会直接使用 root 用户作为应用启动项,但 Dockerfile 默认就是 root 用户,导致挂载生成的文件路径往往是 root 权限,非 root 用户访问就很不方便。

解决方案

1. 安装用户管理工具

若镜像非自带用户管理:

# 权限管理
RUN apk add --no-cache shadow

2. 创建用户并修改权限

# 创建用户组和用户
RUN addgroup -S <app_user_group> && adduser -S -G <app_user_group> <app_user>

# 修改目录权限
RUN chown -R <app_user_group>:<app_user> /data

3. 指定用户启动

执行 docker 时加 --user 参数:

docker run -it --user <app_user> <app_image>:<image_version>

完整示例

FROM alpine:latest

# 国内源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories

RUN apk update --no-cache
# 权限管理
RUN apk add --no-cache shadow
# 调试
RUN apk add --no-cache bash
# 设置时区
RUN apk add --no-cache tzdata

ENV TZ=Asia/Shanghai

# 创建用户组和用户
RUN addgroup -S glog && adduser -S -G glog glog

COPY ./glog_static_musl_1 /app/

RUN mkdir /data

VOLUME [ "/data" ]
WORKDIR /data

# 修改权限
RUN chown -R glog:glog /data
RUN chown -R glog:glog /app

# 指定用户启动
USER glog
CMD [ "/app/glog_static_musl_1", "logsweb", "./conf.ini" ]

总结

关键步骤:

  1. apk add --no-cache shadow - 安装用户管理工具
  2. addgroup + adduser - 创建用户
  3. chown -R - 修改目录权限
  4. USER <username> - 指定运行用户

这样容器内的应用就不再以 root 身份运行,更加安全。

评论