docker-compose volumes 容器内权限会变为root所有?

由于权限是ROOT的导致访问项目出现无权限

情况一

volumes:
    - ./wwwroot:/home/wwwroot

对应容器的目录权限

/home # ls -l
total 8
drwxr-sr-x    2 www-data www-data      4096 Jul 14 00:50 www-data
drwxrwxrwx    3 root     root          4096 Aug  1 08:46 wwwroot

情况二

volumes:
    - ./wwwroot:/home/www-data

对应容器的目录权限

/home # ls -l
total 4
drwxrwxrwx    3 root     root          4096 Aug  1 08:46 www-data

容器本来就有目录www-data并权限也是www-data, 但为什么通过docker-compose编排启动后目录就成ROOT了?

如何在使用docker-compose保证容器原来的权限呢?

或者自定用户及权限?

阅读 12.7k
3 个回答

经过测试,wwwroot目录是主机中的目录且权限也是ROOT, 主机是什么权限挂载到容器内也就是什么权限.

启动容器并进入容器查的容器的www-data目录的www-data用户对应的uid及组为82:82, 所以只要把主机的wwwroot目录改为82:82即可.

step1 进入容器 cat /etc/passwd 假设 www-data:www-data 对应为 82:82

step2 回到主机 chown 82:82 -R ./wwwroot

step3 重新启动 docker-compose up -d

你在dockerfile CMD 之前加上USER APPNAME

这个是对的,docker容器默认会以root权限运行。所以你的挂载目录的owner都会是root。

如果你不希望目录属主是root,必须在容器运行之后执行chown命令修改属主。你会发现很多以非root用户执行的docker镜像(比如mysql, postgresql等等)都会在entrypoint脚本加入这个操作

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏