使用 Visual Studio Code 在容器内开发服务





5.00/5 (6投票s)
使用 VS Code 在本地、云虚拟机或 Kubernetes pod 中运行的容器内,对任何语言的服务进行创作和调试
引言
Docker 容器的优势众所周知。容器提供
- 一致的开发/执行环境
- 与其他应用程序或本地计算机更改隔离
- 容器包含所有必需的依赖项并确保其正确的版本
- 容器无需任何更改即可在本地、云计算节点、Kubernetes pod 中部署
但是,以上所有优势都需要付出代价。直到最近,在开发容器化应用程序时,人们还无法直接使用他们喜欢的 IDE 工具(例如 VS Code、PyCharm、CLion、Eclipse)来编辑文件或调试在容器中运行的应用程序。
开发人员不得不采取捷径和变通方法
- 如果开发是在本地运行的容器中完成的,则可以将本地文件系统挂载到容器内,并使用 IDE 在本地编辑文件,同时在容器中查看更改。
- 对于调试,有些人尝试在容器内安装远程调试器服务器(例如,C++ 的 gdbserver,Python 的 ptvsd)。
- 其他开发人员会安装一个窗口系统、+ VNC 服务器 + IDE 到容器内,并使用 VNC 客户端连接并在容器内工作。
- 然而,大多数开发人员会完全放弃 IDE 工具,转而使用旧式的(但功能强大)终端编辑器(例如,vi 或 emacs)和命令行调试器(例如,gdb)
发生了什么变化?
Visual Studio Code (版本 1.35) 的 2019 年 5 月发布带来了全新的远程开发和远程容器扩展。这些扩展允许将 Docker 容器(本地、远程、Kubernetes pod)用作功能齐全的开发环境,来编辑和调试 VS Code 或其插件支持的任何语言。唯一的要求是能够 SSH 访问容器。
本文将展示现在使用 VS Code 在正在运行的容器内编辑文件和调试 C++ 或 Python 服务是多么容易。
更多信息
- 在容器内开发
https://vscode.js.cn/docs/remote/containers - 高级容器配置
https://vscode.js.cn/docs/remote/containers-advance
必备组件
在撰写本文时,我使用了一台 Windows 10 Enterprise 笔记本电脑(以下简称本地系统)和一个 Google Cloud Compute Engine VM(以下简称远程系统)。但是,描述的工作流程同样适用于其他云提供商。
本地系统需要安装以下软件
- Windows 10 OpenSSH 客户端
(参见 https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse) - 适用于 Windows 的 Docker Desktop
(参见 https://docs.dockerd.com.cn/docker-for-windows/install/) - Visual Studio Code 及其插件
- 远程开发扩展包 (
ms-vscode-remote.vscode-remote-extensionpack
) - Docker (
ms-azuretools.vscode-docker
)
- 远程开发扩展包 (
- 您需要生成 SSH 密钥并在本地系统上安装它(https://www.linode.com/docs/security/authentication/use-public-key-authentication-with-ssh/)
远程系统需要安装以下软件
- 您需要知道远程系统的 IP 地址。
- 远程系统必须配置为 SSH 密钥身份验证
(https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server)。
您需要在远程系统上安装您的公共 SSH 密钥。 - Docker Engine - 社区版
(例如,https://docs.dockerd.com.cn/install/linux/docker-ce/centos/)
确保您已配置好首选容器注册表的访问权限
(例如,https://cloud.google.com/container-registry/docs/advanced-authentication)
为了验证您的设置是否正确,请确保您可以通过其 IP 地址建立到远程系统的 SSH 连接
PS C:\> ssh drepin@10.128.0.79
Last login: Thu Aug 1 14:17:46 2019 from openvpn.internal
drepin@drepin-dev ~
并在远程系统上拉取您将要处理的容器
drepin@drepin-dev$ docker pull gcr.io/your-project/server-dev
在本地系统上的设置
- 启动第一个 PowerShell 并发出以下命令,将本地 Docker 客户端连接到远程主机上的 Docker Engine
PS C:\> ssh -NL localhost:23750:/var/run/docker.sock drepin@10.128.0.79
- 创建一个空文件夹,并将一个 ${FOLDER}/.devcontainer.json 文件放入其中。
文件的格式在 https://aka.ms/vscode-remote/devcontainer.json 中有描述。
下面是一个用于在容器中进行 C++ 远程开发的此类文件的示例{ "name": "brick-client-dev", // Use pre-created image. "image": "gcr.io/your-project/server-dev", // The optional property can be used to specify additional runtime arguments. "runArgs": [ // Required arguments if using a ptrace-based debugger like C++, Go, and Rust. "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], // Publish ports. "appPort": [8050], // Add in default container specific settings.json values. settings": { "terminal.integrated.shell.linux": "/bin/bash" }, // Install these extensions in the container. "extensions": [ "ms-vscode.cpptools" ] }
- 启动第二个 PowerShell,并发出以下命令来设置
DOCKER_HOST
环境变量,并在刚刚创建的文件夹中启动 VS CodePS C:\> $env:DOCKER_HOST=”localhost:23750” PS C:\> cd ${FOLDER}; code .
- 在 VS Code 中,通过单击 **Reopen in Container** 按钮...运行命令 **Remote-Containers: Reopen Folder in Container**...
...或键入 **<Ctrl>+<Shift>+P**,然后输入 “**Remote-Containers: Reopen Folder in Container**”。
VS Code 将开始在容器内安装 VS Code Server 和插件
-
一两分钟后,您就可以在容器内编辑、构建和调试您的代码了。
临时限制
VS Code 尚未与非 root 容器(例如,从以下 Dockerfile 创建的容器)顺畅配合
FROM ubuntu:18.04
USER 1000
为了解决此限制,我建议您以用户 0 的身份启动容器,并使用 VS Code 连接到它
docker run -it --rm --user 0 --entrypoint /bin/sh gcr.io/your-project/server-dev
我还观察到 Microsoft C/C++ 插件 (ms-vscode.cpptools
) 在容器内运行时存在一些小 bug。
历史
- 2019 年 8 月 3 日:初始版本