使用Docker Compose部署HAPI FHIR Server遇权限拒绝异常
错误信息
Caused by: java.nio.file.AccessDeniedException: /app/target
hapi-fhir-jpaserver-start | at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
hapi-fhir-jpaserver-start | at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
hapi-fhir-jpaserver-start | at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
hapi-fhir-jpaserver-start | at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:397)
hapi-fhir-jpaserver-start | at java.base/java.nio.file.Files.createDirectory(Files.java:700)
hapi-fhir-jpaserver-start | at org.h2.store.fs.disk.FilePathDisk.createDirectory(FilePathDisk.java:347)
hapi-fhir-jpaserver-start | ... 143 common frames omitted
解决方案
匹配卷挂载权限
- 先检查
docker-compose.yml是否将本地目录挂载到了容器内的/app/target。如果是,先获取容器内服务运行用户的UID和GID:docker run --rm -it hapiproject/hapi-fhir-jpaserver:latest id - 给本地挂载目录设置对应权限:
chown -R [容器UID]:[容器GID] ./本地挂载目录路径
也可以直接在
docker-compose.yml的服务块中指定运行用户:services: hapi-fhir-jpaserver-start: user: "1000:1000" # 替换为上面查到的UID:GID- 先检查
调整H2数据库存储路径
错误是H2数据库尝试创建/app/target目录失败导致的,可通过环境变量修改存储位置:
在docker-compose.yml的服务环境变量中添加:environment: # 使用内存数据库(无需磁盘存储) - H2_DATABASE_URL=jdbc:h2:mem:hapifhir # 或者持久化到容器内有权限的目录 # - H2_DATABASE_URL=jdbc:h2:/tmp/hapifhir构建自定义镜像修正目录权限
如果官方镜像本身权限配置有问题,可构建自定义镜像:
创建Dockerfile:FROM hapiproject/hapi-fhir-jpaserver:latest RUN mkdir -p /app/target && chown -R hapi:hapi /app/target修改
docker-compose.yml使用自定义镜像:services: hapi-fhir-jpaserver-start: build: . # 其他配置保持不变
内容的提问来源于stack exchange,提问作者matepolocz

