docker volume 数据卷挂载宿主机时的权限问题处理方式
方案一:gosu
多大型的服务组件都采用该方案,比如:
使用该方案的方式如下:
1.创建一个 user/group
2.安装 gosu(国内环境可以需要翻墙)
3.配置一个目录,比如 /data 作为volume,如:VOLUME /data
4.创建一个 docker-entrypoint.sh 文件,并设置为 ENTRYPOINT 的脚本,如:ENTRYPOINT ["docker-entrypoint.sh"]
5.在 docker-entrypoint.sh 中写脚本,使得所有命令都通过 gosu 执行,如下:
|
|
适用范围:
像 mysql、redis 这些依靠脚本执行的命令的容器环境,可以完美解决容器之间共享目录的问题。
不适合完整项目下的缓存目录的挂载(因为对于这些目录的加载,操作等,都不需要经过脚本文件的执行(此处也可能有,我自己没发现))。
方案二:改目录权限
使用方式如下:
1.创建一个 user/group(如果已经存在则不加,比如 web 项目用的最多的www-data 就不用创建)
2.增加一个环境变量用于扩展自定义目录,比如:ENV VOLUME_PATH=''
3.创建一个 docker-entrypoint.sh 文件,并设置为 ENTRYPOINT 的脚本,如:ENTRYPOINT ["docker-entrypoint.sh"]
4.在 docker-entrypoint.sh 中写脚本,使得第一次操作目录时更改目录的权限,如下:
|
|
5.使用时更改环境变量,比如:ENV VOLUME_PATH=/app/web/assets\ /app/runtime,然后执行修改目录权限的操作,如下:
|
|
适用范围:
项目的运行目录,比如缓存目录等。该方案动态可配置性较高,通过 VOLUME_PATH 可以配置多个目录(多目录配置方式为:目录1\ 目录2\ 目录3)
该方案的局限性在于多个容器共享目录的时候,可能会产生权限归属问题(暂未测试),因为每个容器的用户不能保持一致。
- 本文作者: kriss
- 本文链接: http://www.kriss.pub/2017/11/10/docker-volume-permissions/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
