如何配置VS Code终端权限及解决Ubuntu 20.04下VS Code终端Docker权限异常问题
我来帮你搞定这两个和VS Code终端权限相关的问题,尤其是你遇到的Docker使用障碍:
一、如何配置VS Code终端的权限?
VS Code终端的权限默认和系统shell保持一致,但你可以通过这几种方式调整:
- 以管理员身份启动VS Code:Windows上右键选「以管理员身份运行」;Linux/macOS可以在终端执行
sudo code --user-data-dir(注意:Linux这么运行可能会修改配置文件权限,后续用普通用户打开可能出问题,用完记得把配置目录权限改回tom用户) - 切换默认终端shell:按下
Ctrl+,打开设置,搜索terminal.integrated.defaultProfile,选你常用的shell(比如bash、zsh),确保这个shell的用户权限符合你的需求 - 自定义终端启动命令:在设置里找到
terminal.integrated.profiles.<你的系统>(比如Linux下是terminal.integrated.profiles.linux),给目标shell添加启动参数,比如需要sudo权限的话可以把命令设为sudo -i bash——不过这样每次开终端都要输密码,谨慎使用
二、解决Ubuntu 20.04上VS Code终端用户异常导致Docker无法使用的问题
你看到的user@64a57a936f8d其实是Docker容器内部的用户+容器ID,这说明你的VS Code当前是连接到了一个Docker容器作为开发环境(大概率是用了VS Code的Dev Containers扩展),而不是直接在你的宿主机Ubuntu系统里跑终端——这就是你没法用Docker命令和扩展的核心原因。下面分两种情况解决:
情况1:不需要容器环境,回到宿主机终端
- 看VS Code左下角的状态栏,会有类似
Dev Container: XXX的标识,点击它 - 在弹出的菜单里选「Reopen in Local」,VS Code会重启并回到宿主机环境
- 此时终端应该显示
tom@你的主机名,如果之前刚把tom加入docker组,要么重启终端,要么执行newgrp docker让权限立即生效,之后就能正常用Docker命令和扩展了
情况2:需要在容器环境内使用Docker命令
如果必须在容器里开发,那得让容器能访问宿主机的Docker服务,同时配置好权限:
挂载宿主机的Docker Socket
找到项目根目录下的.devcontainer/devcontainer.json(如果没有就新建这个目录和文件),添加以下配置:"mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ]这个配置会把宿主机的Docker服务套接字挂载到容器里,让容器能直接调用宿主机的Docker。
同步用户权限
为了避免权限冲突,要让容器内的用户UID/GID和宿主机的tom用户一致:- 先在宿主机终端执行
id tom,记下输出里的UID(比如1000)和GID(比如1000) - 在
devcontainer.json里添加:"remoteUser": "tom", "containerUser": "tom", "initializeCommand": "usermod -u 你的UID tom && groupmod -g 你的GID tom" - 如果容器里还没有tom用户,就改成创建用户的命令:
"initializeCommand": "useradd -m -u 你的UID tom && usermod -aG docker tom"
- 先在宿主机终端执行
重启容器环境
点击左下角的Dev Container标识,选「Rebuild Container」,等容器重建完成后,终端里的用户权限就和宿主机同步了,此时就能正常执行Docker命令了。
另外还有个临时快速办法:进入容器终端后,直接执行sudo usermod -aG docker $USER,然后重启终端也能解决,但每次重建容器都要重新执行,不如配置devcontainer.json一劳永逸。
内容的提问来源于stack exchange,提问作者Jan Berndt

