Windows WSL2环境Docker Compose卷配置JHipster H2数据库权限问题咨询
问题1:为何绑定挂载可以正常工作,默认Docker命名卷却会出现权限问题?
- Windows + WSL2 环境下的绑定挂载默认会走WSL2与Windows文件系统的互操作层,该层会忽略Linux原生的UID/GID权限校验,挂载后的目录默认对所有容器内用户开放读写权限,因此UID为1000的应用用户可以直接写入文件。
- 默认Docker命名卷是创建在WSL2的Linux原生文件系统中的,初始化时卷的所有者为root用户,默认权限为
755,仅root用户拥有写入权限,你的应用运行时使用无root权限的UID 1000用户,自然无法写入目录,触发权限报错。
问题2:使用Docker命名卷实现H2数据库文件在Windows宿主机持久化的配置方案
不需要强行配置原生命名卷的driver_opts参数,推荐两种更稳定的实现方案:
方案1:添加初始化容器修改卷权限(最通用稳定)
通过临时运行的root权限初始化容器修改命名卷的所有者为UID 1000,之后应用即可正常写入,配置如下:
version: '3.8' services: # 初始化容器,仅负责修改卷权限,执行完成后自动退出 init-db-volume: image: busybox:stable volumes: - scriba-db:/tmp/h2 command: chown -R 1000:1000 /tmp/h2 app: image: scriba_webapp # 等待初始化容器执行完成后再启动应用 depends_on: init-db-volume: condition: service_completed_successfully environment: - ... ports: - ... volumes: - scriba-db:/tmp/h2 volumes: scriba-db:
方案2:配置命名绑定卷(兼顾命名卷管理特性和绑定挂载的权限兼容性)
本质是给绑定挂载定义一个命名卷别名,既可以用Docker命令管理卷,又享受Windows绑定挂载的权限特性,数据直接持久化到指定的Windows目录,配置如下:
version: '3.8' services: app: image: scriba_webapp environment: - ... ports: - ... volumes: - scriba-db:/tmp/h2 volumes: scriba-db: driver: local driver_opts: type: none o: bind # 替换为你Windows上实际要存放H2数据库文件的目录路径 device: D:\path\to\your\h2\storage
内容的提问来源于stack exchange,提问作者Michael Bonelli
相关产品推荐
相关产品推荐

