文章目录
- 前言
- [1. 现代软件开发中的环境痛点](#1. 现代软件开发中的环境痛点)
-
- [1.1 跨平台环境不一致与二进制包难题](#1.1 跨平台环境不一致与二进制包难题)
- [1.2 Python 版本与全局依赖污染](#1.2 Python 版本与全局依赖污染)
- [1.3 本地开发与生产环境严重脱节](#1.3 本地开发与生产环境严重脱节)
- [2. 什么是 DevContainer](#2. 什么是 DevContainer)
-
- [2.1 DevContainer 的定义与核心理念](#2.1 DevContainer 的定义与核心理念)
- [2.2 DevContainer 与普通 Docker 容器的区别](#2.2 DevContainer 与普通 Docker 容器的区别)
- [2.3 解构 .devcontainer 目录](#2.3 解构 .devcontainer 目录)
- [3. PyCharm 中使用 DevContainer 实战指南](#3. PyCharm 中使用 DevContainer 实战指南)
-
- [3.1 前置条件](#3.1 前置条件)
- [3.2 创建配置结构](#3.2 创建配置结构)
- [3.3 编写 Dockerfile](#3.3 编写 Dockerfile)
- [3.4 编写 devcontainer.json](#3.4 编写 devcontainer.json)
- [3.5 在 PyCharm 中启动并连接 DevContainer](#3.5 在 PyCharm 中启动并连接 DevContainer)
-
- [3.5.1 创建 Dev 容器](#3.5.1 创建 Dev 容器)
- [3.5.2 设置中文环境](#3.5.2 设置中文环境)
- [4. 总结](#4. 总结)
前言
在现代软件开发流程中,我们经常能听到一句令所有开发者苦笑的辩解:"这代码在我电脑上运行得好好的!"
尽管敏捷开发、微服务架构以及 CI/CD 持续集成普及已久,但环境管理的乱象依然是许多技术团队的噩梦。从 Python 版本冲突、二进制依赖缺失,到操作系统底层差异导致的偶发性 Bug,开发环境配置所消耗的时间往往不亚于业务代码本身的编写。
为了从根本上解决"环境配置"这一长期存在的工程痛点,DevContainer(Development Container) 理念应运而生。它将容器技术直接引入开发生命周期,实现了"开发环境即代码(Development Environment as Code)"。
本文将结合 PyCharm 集成开发环境,一步步讲解如何构建一个一致、隔离且高效的开发环境。
1. 现代软件开发中的环境痛点
无论你是单打独斗的独立开发者,还是在大型团队中协同研发的后端工程师,很可能都遭遇过以下典型难题:
1.1 跨平台环境不一致与二进制包难题
团队成员通常使用不同的操作系统(macOS、Windows、Ubuntu)。当 Python 项目依赖某些底层的 C/C++ 扩展(如 numpy、pandas、psycopg2、grpcio 等)时,相同的 pip install 命令在不同平台上的编译结果和运行时行为可能大相径庭。
1.2 Python 版本与全局依赖污染
随着项目增多,你的宿主机上可能同时存在 Python 3.8、3.10、3.12。即便使用了 venv 或 conda,宿主机上安装的系统级动态链接库(如 openssl、libpq、gdal)依然会在全局层面相互干扰,导致"此项目正常,彼项目崩溃"的奇特现象。
1.3 本地开发与生产环境严重脱节
本地开发通常在 macOS 或 Windows 上进行,而生产部署的环境多为 Linux 容器(如 Alpine 或 Ubuntu)。开发与生产环境在文件系统路径、大小写敏感度、系统服务权限、网络协议栈等方面的差异,极易导致上线时才暴露隐患。
DevContainer 的出现,正是为了将开发者从这些无休止的环境泥潭中彻底解脱出来。
2. 什么是 DevContainer
2.1 DevContainer 的定义与核心理念
DevContainer(Development Container) 是由 Microsoft 倡导并逐渐成为 Open Remote Development 标准的一种规范。它允许开发者将标准的 Docker 容器直接作为开发环境使用。
在传统开发模式中,IDE 运行在宿主机上,代码在宿主机上编译与运行;而在 DevContainer 模式下,IDE(或其后端服务)直接与运行在 Docker 容器内的 Python 解释器、系统依赖和运行环境进行通信与交互。
2.2 DevContainer 与普通 Docker 容器的区别
许多开发者会问:"我平时也会用 Docker 跑数据库或部署应用,这和 DevContainer 有什么不同?"
两者在设计目标上存在本质差异:
-
普通应用容器(Production Docker Image): 追求极简与安全。通常使用轻量级的镜像(如 alpine 或 distroless),去除所有调试工具、构建依赖和 Shell 接口,仅保留运行单个应用所需的极简运行时。
-
开发容器(DevContainer): 追求功能完备与可开发性。镜像内不仅包含运行代码的环境,还预装了必要的构建工具(gcc、make、git)、调试器(debugpy)、代码格式化与检查工具(black、flake8、mypy)以及 Shell 增强配置。
2.3 解构 .devcontainer 目录
DevContainer 的核心配置文件存放在项目根目录下的 .devcontainer 文件夹中。典型的目录结构如下:
bash
project-root/
├── .devcontainer/
│ ├── devcontainer.json # DevContainer 的核心配置文件
│ └── Dockerfile # 用于构建开发环境的镜像文件
├── src/
├── requirements.txt
└── README.md
各组件分工明确:
-
Dockerfile: 定义底层的 Linux 系统环境、安装系统级依赖库(如 curl、git、libpq-dev)以及 Python 基础版本。
-
devcontainer.json: 作为环境的"大脑",定义如何运行该容器。例如:项目挂载路径、端口映射、容器内环境变量、需要预装的 IDE 插件、开发用户权限等。
3. PyCharm 中使用 DevContainer 实战指南
3.1 前置条件
1、Docker 运行时:
- macOS / Windows: 安装并启动 Docker Desktop(Windows 建议配置 WSL 2 后端)。
- Linux: 安装 Docker Engine,并确保当前用户已加入 docker 用户组。
2、PyCharm 版本:
- 需要 PyCharm Professional(专业版)。专业版内置了对 Remote Development、Docker 解释器以及 DevContainer 的完整支持。
3、关键插件确认:
- 打开 Settings -> Plugins,确保 Docker 和 Dev Containers 插件处于激活状态。
3.2 创建配置结构
在项目根目录下创建 .devcontainer 目录,并新增 Dockerfile 与 devcontainer.json。
项目整体文件组织结构如下:
bash
my-python-app/
├── .devcontainer/
│ ├── devcontainer.json
│ └── Dockerfile
├── src/
│ └── main.py
├── requirements.txt
└── README.md
3.3 编写 Dockerfile
编写用于开发环境的 Dockerfile:
bash
FROM docker.1ms.run/ubuntu:22.04
# 带有nvidia驱动的镜像
#FROM docker.1ms.run/nvidia/cuda:12.1.1-devel-ubuntu22.04
# FROM docker.1ms.run/nvidia/cuda:13.3.0-devel-ubuntu22.04
# FROM docker.1ms.run/nvidia/cuda:13.3.0-devel-ubuntu24.04
# 执行命令时,不需要交互,直接运行
ARG DEBIAN_FRONTEND=nointeractive
RUN apt-get update \
&& apt install -y -q \
cmake \
git \
python3 \
python3-pip \
wget \
x11-apps \
sudo \
python3-venv \
vim
CMD ["/bin/bash"]
3.4 编写 devcontainer.json
devcontainer.json 用于告诉 PyCharm 如何构建与管理该开发容器。
bash
//
{
/* 显示在UI上的容器名称 */
"name": "AI",
/* 加载本地的文件夹到镜像的/workspaces文件夹 */
"workspaceMount": "source=${localWorkspaceFolder},target=/workspaces,type=bind",
/* 容器内的工作空间文件夹路径,也就是说容器运行后打开的就是这个文件夹 */
"workspaceFolder": "/workspaces",
/* 当容器创建时所下载的VSCODE插件挂载到容器target的路径下,
这样再rebuild容器时不用再次下载VSCODE插件
*/
"mounts": [
"source=extensionCache,target=/root/.vscode-server/extensions,type=volume"
],
/* 根据Dockerfile的内容创建容器 */
"build": {
"dockerfile": "Dockerfile"
},
// /* 将配置插件的相关参数复印到容器中去 */
// "settings": {
// "idf.showOnboardingOnInit": false,
// "idf.toolsPath": "/opt/esp",
// "idf.espIdfPath": "/opt/esp/idf",
// "terminal.integrated.shell.linux": "/bin/bash"
// },
/* 选择容器在创建时,需要安装的插件 */
"customizations": {
"vscode": {
"extensions": [
"ms-vscode.cmake-tools",
"ms-vscode.cpptools",
"ms-vscode.cpptools-themes",
"morningfrog.urdf-visualizer",
"xelad0m.jupyter-toc",
"mikeburgh.xml-format",
"esbenp.prettier-vscode",
"openai.chatgpt"
]
}
},
// /* 使用特权的方式启动容器,否则在镜像中将无法访问usbip绑定的USB设备 */
"runArgs": [
"--privileged",
"--gpus=all",
"--pid=host",
// "--tmpfs", "/tmp",
// "-v", "/tmp/.X11-unix:/tmp/.X11-unix",
// "-p", "6080:80",
"-e", "DISPLAY=host.docker.internal:0.0",
"-e", "PULSE_SERVER=host.docker.internal",
"-e", "container=docker",
"-e", "CUDA_VISIBLE_DEVICES=0" //设置让显卡可见,这个意思是保留0号显卡,
]
}
3.5 在 PyCharm 中启动并连接 DevContainer
完成配置文件编写后,即可在 PyCharm 中启动 DevContainer 开发环境:
3.5.1 创建 Dev 容器
选择 创建 Dev Container 并挂载源代码


第一次使用PyCharm创建容器要那啥,PyCharm从外网下载相关的库
重新连接容器

3.5.2 设置中文环境
为了中文不显示乱码,接下来配置:
1、首先下载language-pack-zh-hans,这个包里面有各个语言的字符集
bash
sudo apt install language-pack-zh-hans
2、设置/etc/locale.gen
bash
vim /etc/locale.gen
进入这个文件,一滑到底,将zh_CN.UTF-8 UTF-8一行解开注释(需要按i键进入编辑模式)。

3、安装字符集
bash
sudo locale-gen
4、切换系统字符集为zh_CN.utf8
bash
sudo vim /etc/profile
编辑/etc/profile,在最后新增两行代码:
################################################
export LANG=zh_CN.UTF-8
export LANGUAGE=zh_CN:zh
################################################
source /etc/profile
5、最后,一定要重启dev容器
6、【可选】加入要显示pycharm中运行的gui,需要打开mobaxterm软件。
4. 总结
在软件工程演进的历史长河中,我们不断将各种手动规程转变为可执行的代码------从 CI/CD Pipeline 脚本(流水线即代码),到 Terraform / Ansible(基础设施即代码)。而 DevContainer,则是这一演进路线在开发端侧的自然延伸:开发环境即代码(Development Environment as Code)。
借助 PyCharm + DevContainer 的组合,我们能够获得:
- 绝对一致的环境: 彻底抹平操作系统差异,杜绝"在我电脑上是好的"这一工程顽疾。
- 极佳的开发体验: 在享受容器隔离与类生产环境特性的同时,保留 PyCharm 原生强大的代码补全、可视化断点调试与测试支持。
参考: