最近在处理项目时,遇到一个比较难搞的事情,项目时微服务架构的,很多服务都是用同一个java的基础镜像来构建的,服务镜像已经打好了,但是客户现场要求用自己定义的用户来启动,不能用我们构建镜像时指定的用户来启动,不可能每个镜像都去重新打包,一方面是因为镜像程序太多,另外一方面,不可能为了一个客户单独维护一份Jenkins流水线,那剩下的唯一的一条路,就是在镜像启动时执行一些脚本了和赋权了
1. 修改容器启动的docker-compose.yml
1)获取启动的自定义账号的uid、gid,在此以ywgl为例
ywgl 账号登录操作系统,执行命令id
bash
su ywgl
id

2. 上传gosu文件到容器所在服务器,停掉容器
gosu 是一个专为容器环境设计的轻量级用户切换工具(类似 su/sudo,但更适合 Docker)。它的核心定位是:"以 Root 启动做初始化,最终降权以普通用户运行主程序"
2)上传docker-entrypoint.sh 、gosu 到cwos目录,
给账号权限:
bash
chown -R ywgl:ywgl docker-entrypoint.sh
chown -R ywgl:ywgl gosu
给执行权限:
bash
chmod +x docker-entrypoint.sh
chmod +x gosu
3)修改容器应用的docker-compose.yml 文件
yaml
version: '3'
services:
nginx:
image: xxxxxxxxxxx/ai_docker_release/jcyw/nginx:R1.24.0.cwos
container_name: "nginx"
network_mode: bridge
restart: always
user: "0:0" ##使用root用户进行=前置初始化
ports:
- 80:8080
- 443:10444
- 38760:38760
environment:
- "LANG=en_US.UTF-8"
- USER_ID=2025 # 自动获取宿主机UID
- GROUP_ID=2025 # 自动获取宿主机GID
- GROUP_NAME=ywgl # 自动获取宿主机组名
- USER_NAME=ywgl # 自动获取宿主机用户名
volumes:
- /etc/localtime:/etc/localtime:ro
- ./logs:/var/log/nginx:z
- /etc/hosts:/etc/hosts:ro
- ./ssl:/etc/nginx/ssl:z
- ./nginx.conf:/etc/nginx/nginx.conf:z
- ./conf.d:/etc/nginx/conf.d:z
- /data/cwos/h5live:/data/cwos/h5live
- /data/cwos/video:/data/cwos/video
- ../gosu:/usr/local/bin/gosu ##把gosu文件映射到容器内部
- ./nginx-entrypoint.sh:/docker-entrypoint.sh ##容器文件初始化和权限降权的脚本
entrypoint: ["/docker-entrypoint.sh"] ##在启动时执行的脚本,注意和上面映射的路径必须完全一致
command:
- nginx
- -g
- daemon off;
working_dir: /tmp/nginx-1.24.0
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
docker-entrypoint.sh文件的内容大致如下:

脚本说明:
1、容器启动时默认是 Root。脚本前半部分读取了 docker-compose 传入的环境变量(USER_NAME=ywg1, USER_ID=2025 等),动态创建用户和组,并 chown 相关目录(如 /var/cache/nginx、/etc/nginx),确保目录权限匹配
2、sh -c 'exec "@"′−−"@"' -- "@"′−−"@":在目标用户下启动 Shell 并执行原参数。0代表脚本本身或传入的命令,0 代表脚本本身或传入的命令,0代表脚本本身或传入的命令,@ 代表所有参数。
实际效果:结合 docker-compose 的 command: nginx -g daemon off;,这句最终等价于:以 ywg1 用户身份启动 Nginx。
3. 删除容器已有的logs,重新启动程序
4)换账号到ywgl,删除logs文件夹下的日志文件,重启应用
停止:docker-compose down
启动:docker-compose up -d
5)功能验证,nacos功能正常,日志生成账号为启动账号ywgl

修改后启动脚本后的,重新启动nginx容器生成的日志的信息
