背景
因为喜欢 Linux && 喜欢干净的开发环境,我的开发基本不会基于 Windows 进行,一般都是在 Linux 上启动 Container 进行开发。之前因为在实验室研究的经历,对 K8S 较为熟悉,所以很长一段时间都是在 K8S 上开一个 Pod 然后 SSH 过去进行开发(
但是时间久了之后,也觉得这样的开发方式心智负担过重了,遂和 AI 聊了一下,基于 VSCode / Cursor 的 Dev Containers 插件配置了 Hugo 使用 Docker Container 的开发方式。具有如下优点:
- 轻量、简单 - 只要有 Docker 就行
- 支持 SSH 私钥 - 可以安心地在容器内
git push,不需要回到宿主机上执行命令 - 配置文件化 - 更换机器 / 开发环境不需要从头配置,文件中包含了所有配置内容
配置步骤
- 在 Cursor 上安装
anysphere.remote-containers(Dev Containers)插件。 - 在项目根目录下创建
.devcontainer文件夹。 文件夹中可以包含以下文件:devcontainer.json最核心的配置,包括了怎么构建镜像,怎么挂载目录,怎么启动容器等等……Dockerfile如果项目只有在开发过程中用到 Docker (如本博客,部署依赖于伟大的 Cloudflare ),则可以把 Dockerfile 放在该文件夹下。
- 以下提供了一个
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" }
- 顺便提供本博客编写时用的 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
启动容器步骤
- 首先通过 SSH 连接到远程服务器(如果你是本地则跳过这步),然后打开对应的项目文件夹
- 如果已经安装过 Dev Containers 的插件了,按
Ctrl + Shift + P然后找到这个指令:Dev Containers: Reopen in Container - 插件将会根据你的配置自动为你构建镜像,然后运行镜像,并把你的 VSCode / Cursor 连接过去
- 接下来就可以快乐地进行开发了!