背景

因为喜欢 Linux && 喜欢干净的开发环境,我的开发基本不会基于 Windows 进行,一般都是在 Linux 上启动 Container 进行开发。之前因为在实验室研究的经历,对 K8S 较为熟悉,所以很长一段时间都是在 K8S 上开一个 Pod 然后 SSH 过去进行开发(

但是时间久了之后,也觉得这样的开发方式心智负担过重了,遂和 AI 聊了一下,基于 VSCode / Cursor 的 Dev Containers 插件配置了 Hugo 使用 Docker Container 的开发方式。具有如下优点:

  1. 轻量、简单 - 只要有 Docker 就行
  2. 支持 SSH 私钥 - 可以安心地在容器内 git push ,不需要回到宿主机上执行命令
  3. 配置文件化 - 更换机器 / 开发环境不需要从头配置,文件中包含了所有配置内容

配置步骤

  1. 在 Cursor 上安装 anysphere.remote-containers (Dev Containers)插件。
  2. 在项目根目录下创建 .devcontainer 文件夹。 文件夹中可以包含以下文件:
    • devcontainer.json 最核心的配置,包括了怎么构建镜像,怎么挂载目录,怎么启动容器等等……
    • Dockerfile 如果项目只有在开发过程中用到 Docker (如本博客,部署依赖于伟大的 Cloudflare ),则可以把 Dockerfile 放在该文件夹下。
  3. 以下提供了一个 devcontainer.json 的示例,包含了最简单的构建功能:
    JSON
    {
        "name": "Hugo Dev Container",
        "build": {
            "dockerfile": "Dockerfile",
            // 指定项目根目录为构建的 context
            "context": ".."
        },
        // Hugo 的端口转发
        "forwardPorts": [
            1313
        ],
        "customizations": {
            "vscode": {
                "extensions": [
                    // 这里可以为 container 指定安装的插件
                    "eamodio.gitlens"
                ]
            }
        },
        "mounts": [
            // 挂载你的 SSH 目录到容器中,使其可以访问宿主机的密钥
            "source=${localEnv:HOME}${localEnv:USERPROFILE}/.ssh,target=/home/vscode/.ssh,type=bind",
            // 挂载你的 GPG 目录到容器中
            "source=${localEnv:HOME}${localEnv:USERPROFILE}/.gnupg,target=/home/vscode/.gnupg,type=bind,consistency=delegated"
        ],
        "remoteUser": "vscode"
    }
  4. 顺便提供本博客编写时用的 Dockerfile 文件做参考:
    Dockerfile
    # 选择一个稳定的、较小的基础镜像,这里我们继续使用 Ubuntu 22.04
    FROM ubuntu:22.04
    
    # 使用一个 RUN 命令链来安装所有软件,这能有效减少镜像的层数
    RUN apt-get update && \
        apt-get install -y --no-install-recommends \
            git \
            vim \
            openssh-client \
            gnupg && \
        # 安装完成后清理 APT 缓存,以减小镜像大小
        apt-get clean && \
        rm -rf /var/lib/apt/lists/*
    
    ARG USERNAME=vscode
    # 你可以在宿主机上运行 id -u 命令来获取你的用户 ID
    ARG USER_UID=1000
    ARG USER_GID=$USER_UID
    RUN groupadd --gid $USER_GID $USERNAME \
        && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -s /bin/bash
    ADD bin/hugo_0.134.3_linux-amd64.deb /root
    RUN dpkg -i /root/hugo_0.134.3_linux-amd64.deb && rm /root/hugo_0.134.3_linux-amd64.deb

启动容器步骤

  1. 首先通过 SSH 连接到远程服务器(如果你是本地则跳过这步),然后打开对应的项目文件夹
  2. 如果已经安装过 Dev Containers 的插件了,按 Ctrl + Shift + P 然后找到这个指令:
    Dev Containers: Reopen in Container
  3. 插件将会根据你的配置自动为你构建镜像,然后运行镜像,并把你的 VSCode / Cursor 连接过去
  4. 接下来就可以快乐地进行开发了!