无法以非默认用户身份在Docker中运行ownCloud
解决ownCloud Docker镜像指定用户启动的权限问题
问题原因
当你用--user 1005:1005启动容器时,镜像的entrypoint脚本05-nsswrapper.sh需要在/home/owncloud目录下生成passwd文件,用于识别自定义用户。但该目录默认属于root用户,1005用户没有写入权限,因此抛出Permission denied错误。
解决方案1:调整NSS_WRAPPER文件路径(推荐)
通过环境变量将nsswrapper生成的passwd和group文件指向临时目录(/tmp默认对所有用户开放写入权限),绕开/home/owncloud的权限限制:
Docker Run 命令
docker run --user 1005:1005 \ -e NSS_WRAPPER_PASSWD=/tmp/passwd \ -e NSS_WRAPPER_GROUP=/tmp/group \ owncloud/server:latest
Docker Compose 配置
version: '3.8' services: owncloud: image: owncloud/server:latest user: "1005:1005" environment: - NSS_WRAPPER_PASSWD=/tmp/passwd - NSS_WRAPPER_GROUP=/tmp/group volumes: # 挂载外部磁盘的数据目录到容器内 - /path/to/external/disk/owncloud-data:/mnt/data ports: - 8080:80
解决方案2:预配置/home/owncloud目录权限
用初始化容器先修改/home/owncloud的所有者为1005:1005,确保主容器启动时有写入权限:
Docker Compose 配置
version: '3.8' services: init-owncloud: image: owncloud/server:latest user: root volumes: # 本地目录持久化容器的/home/owncloud - ./owncloud-home:/home/owncloud command: ["chown", "-R", "1005:1005", "/home/owncloud"] restart: "no" owncloud: image: owncloud/server:latest user: "1005:1005" volumes: - ./owncloud-home:/home/owncloud - /path/to/external/disk/owncloud-data:/mnt/data ports: - 8080:80 depends_on: init-owncloud: condition: service_completed_successfully
第一次启动时,初始化容器会完成权限修改,之后主容器即可正常启动。
解决方案3:自定义Entrypoint脚本
创建自定义脚本,先以root身份修改权限,再切换到指定用户启动服务:
- 新建
custom-entrypoint.sh:
#!/bin/sh # 给当前用户赋予/home/owncloud的读写权限 chown -R "$(id -u):$(id -g)" /home/owncloud # 执行原entrypoint脚本 exec /entrypoint.sh "$@"
- 赋予脚本执行权限:
chmod +x custom-entrypoint.sh
- Docker Compose 配置:
version: '3.8' services: owncloud: image: owncloud/server:latest user: "1005:1005" volumes: - ./custom-entrypoint.sh:/custom-entrypoint.sh - /path/to/external/disk/owncloud-data:/mnt/data entrypoint: ["sh", "/custom-entrypoint.sh"] ports: - 8080:80
内容的提问来源于stack exchange,提问作者Robert Franz
相关产品推荐
相关产品推荐

