最简VS Code Dev Containers配置下容器内无法写入文件问题
Dev Container内创建文件权限拒绝问题排查
环境信息
- devcontainer@0.35.0
- Docker version 23.0.4, build f480fb1
- Docker Compose version v2.17.2
- 主机系统:Ubuntu 20.04
项目目录结构
.devcontainer |- .devcontainer.json |- Dockerfile
.devcontainer.json 配置
{"name": "Node.js","build": {"dockerfile": "Dockerfile"},"settings": {"terminal.integrated.defaultProfile.linux": "bash","terminal.integrated.profiles.linux": {"bash": {"path": "/bin/bash","icon": "terminal-bash"}}},"extensions": ["dbaeumer.vscode-eslint"]}
Dockerfile 内容
FROM mcr.microsoft.com/devcontainers/typescript-node:20
问题描述
执行devcontainer build .和devcontainer open后,在容器内的VS Code终端尝试创建test.txt时提示权限拒绝。已确认容器内node用户的UID为1000,与主机用户craig的UID一致,但主机可正常创建文件。
疑问:
- 忽略了什么配置?
- 是否因为主机是Ubuntu Linux而非WSL导致该问题?
解决方案
检查主机项目目录权限
即便容器内用户UID和主机一致,主机项目目录的所有者或权限设置可能限制了容器写入。在主机执行以下命令检查:ls -ld /path/to/your/project确保目录所有者为UID 1000(craig用户),且具备写入权限。若权限不符,执行调整命令:
sudo chown -R craig:craig /path/to/your/project sudo chmod -R u+w /path/to/your/project添加Dev Container权限配置
默认镜像的node用户可能缺少对挂载工作区的写入权限,可通过两种方式修复:- 修改
.devcontainer.json,添加remoteUser和初始化命令:{ "name": "Node.js", "build": {"dockerfile": "Dockerfile"}, "settings": { "terminal.integrated.defaultProfile.linux": "bash", "terminal.integrated.profiles.linux": { "bash": {"path": "/bin/bash","icon": "terminal-bash"} } }, "extensions": ["dbaeumer.vscode-eslint"], "remoteUser": "node", "postCreateCommand": "sudo chown -R node:node /workspaces" } - 在Dockerfile中添加权限调整步骤:
FROM mcr.microsoft.com/devcontainers/typescript-node:20 RUN sudo chown -R node:node /workspaces
- 修改
关于Ubuntu vs WSL的说明
该问题和主机是Ubuntu还是WSL无关。WSL下Windows文件系统的权限映射规则相对宽松,而Ubuntu主机的Linux文件系统权限校验更严格,因此需要明确配置权限对齐,而非系统类型导致。
内容的提问来源于stack exchange,提问作者Craig Hicks
相关产品推荐
相关产品推荐

