65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2019年8月3日

CPOL

4分钟阅读

viewsIcon

12007

使用 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 服务是多么容易。

更多信息

必备组件

在撰写本文时,我使用了一台 Windows 10 Enterprise 笔记本电脑(以下简称本地系统)和一个 Google Cloud Compute Engine VM(以下简称远程系统)。但是,描述的工作流程同样适用于其他云提供商。

本地系统需要安装以下软件

远程系统需要安装以下软件

为了验证您的设置是否正确,请确保您可以通过其 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 Code
    PS 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 日:初始版本
© . All rights reserved.