--- title: Docker 构建时指定用户启动 published: 2025-04-01 updated: 2025-04-01 image: /posts/docker-user-start/img/cover.svg description: 解决 Docker 容器默认以 root 用户运行导致的权限问题,指定非 root 用户启动应用。 tags: ['Docker', '运维', 'Linux'] draft: false series: Docker 实践笔记 seriesOrder: 2 difficulty: 入门 --- ## 前言 我们在 Linux 使用应用时,往往不会直接使用 root 用户作为应用启动项,但 Dockerfile 默认就是 root 用户,导致挂载生成的文件路径往往是 root 权限,非 root 用户访问就很不方便。 ## 解决方案 ### 1. 安装用户管理工具 若镜像非自带用户管理: ```dockerfile # 权限管理 RUN apk add --no-cache shadow ``` ### 2. 创建用户并修改权限 ```dockerfile # 创建用户组和用户 RUN addgroup -S && adduser -S -G # 修改目录权限 RUN chown -R : /data ``` ### 3. 指定用户启动 执行 docker 时加 `--user` 参数: ```bash docker run -it --user : ``` ## 完整示例 ```dockerfile 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 ` - 指定运行用户 这样容器内的应用就不再以 root 身份运行,更加安全。