先决条件
要学习本教程,你将需要以下内容:
在本文中,我们将使用官方 Python 映像 — python:3.10.
开发容器扩展
在开始之前,让我们先解释一下什么是 Dev Containers 扩展,以及什么时候应该考虑使用它。
简而言之,VScode Dev Containers 扩展使你能够在 docker 容器内无缝打开一个隔离的 VScode 会话。隔离级别包括以下三层:
devcontainer.json 文件定义了会话设置,使我们能够设置和定义上述三层。
要在带有 Dev Containers 扩展的容器内设置并启动项目文件夹,需要以下两个组件:
下图描述了 Dev Containers 的总体架构:
启动时,Dev Containers 扩展会在容器内运行一个新的 VScode 会话。默认情况下,它会将本地文件夹挂载到容器中,这样我们就能保持代码的持久性并与本地文件夹同步。你可以挂载其他文件夹,但这不在本教程的范围之内。
设置 Docker 化 Python 环境
在开始使用 devcontainer.json 设置之前,让我们先定义一下开发环境的范围。它应包括以下功能:
在下面的章节中,我们将深入研究 devcontainer.json 文件的核心功能。我们将从一个简约的 Python 环境开始,并演示如何通过添加不同的自定义层来定制它。
构建与映像
使用 Dev Containers 扩展启动容器化会话的主要要求是定义映像设置。有两种设置映像的方法:
根据不同的使用情况,每种方法都各有利弊。如果已有完全符合环境要求的映像,则应考虑使用映像参数。同样,当你有一个基础镜像,但需要添加一些小的自定义设置时,也可以使用构建参数。
基本的 Docker 化 Python 环境
下面的 devcontainer.json 文件提供了一个设置 Python 环境的简单示例。它使用 image 参数将 python:3.10 映像定义为会话环境:
devcontainer.json
{
"name": "Python Development Environment",
"image": "python:3.10"
}
name 参数定义环境名称。在本例中,我们将其设置为 Python 开发环境。
启动环境前,请确保:
.
└── .devcontainer
└── devcontainer.json
要启动会话,请单击左下角的 Dev Container >< 符号,然后选择 "在容器中重新打开"(Reopen in Container)选项,如下图所示:
请注意,在会话首次启动时,Dev Containers 扩展会查找 image 参数定义的映像(本例中为 python:3.10)。如果本地没有可用的映像,它会从 Docker Hub 中提取,这可能需要几分钟时间。之后,启动会话只需几秒钟。
在上面的截图中,你可以看到 devcontainer.json 参数和会话设置之间的映射。会话名称现在位于右下方(用紫色标出),并与 name 参数的值对齐。同样,会话现在运行在 python:3.10 容器中,你可以从终端启动 Python。
Python 容器自带了默认的 Python 库。
使用 Dockerfile 自定义 Python 环境
现在,让我们通过修改 devcontainer.json 来定制上述环境。我们将用 build 参数替换 image 参数。通过 build 参数,我们可以在会话启动时使用 Dockerfile 构建映像,并将参数传递给 docker build 函数。我们将按照本帖中演示的方法来设置 Python 环境:
我们将使用下面的 Dockerfile 来设置 Python 环境:
Dockerfile
FROM python:3.10
ARG PYTHON_ENV=my_env
ENV PYTHON_ENV=$PYTHON_ENV
RUN mkdir requirements
COPY requirements.txt set_python_env.sh /requirements/
RUN bash ./requirements/set_python_env.sh $PYTHON_ENV
我们使用 FROM 参数导入 Python 映像,使用 ARG 和 ENVarguments 将虚拟环境设置为参数和环境变量。此外,我们还使用以下两个辅助文件来设置虚拟环境和安装所需的库:
requirements.txt
wheel==0.40.0
pandas==2.0.3
ipykernel
ipywidgets
jupyter
set_python_env.sh
#!/usr/bin/env bash
PYTHON_ENV=$1
python3 -m venv /opt/$PYTHON_ENV \
&& export PATH=/opt/$PYTHON_ENV/bin:$PATH \
&& echo "source /opt/$PYTHON_ENV/bin/activate" >> ~/.bashrc
source /opt/$PYTHON_ENV/bin/activate
pip3 install -r ./requirements/requirements.txt
最后,我们将使用下面的测试文件来评估 Pandas 库是否安装正确,并打印 Hello World!
test1.py
import pandas as pd
print("Hello World!")
让我们对 devcontainer.json 文件进行修改,用构建参数替换图像参数:
devcontainer.json
{
"name": "Python Development Environment",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
"PYTHON_ENV": "my_python_dev"
}
}
}
通过向 docker build 函数传递参数,构建子参数(build subarguments)可以让我们自定义镜像的构建。我们使用以下参数来构建镜像:
你应该将 Dockerfile、requirements.txt 和 set_python_env.sh 这三个文件与 devcontainer.json 文件一起保存在 .devcontainer 文件夹下:
.
├── .devcontainer
│ ├── Dockerfile
│ ├── devcontainer.json
│ ├── requirements.txt
│ └── set_python_env.sh
└── test2.py
现在,让我们使用新设置启动会话,并使用 test1.py 文件进行测试:
从上面的截图中可以看到,我们成功地从终端运行了测试脚本(用紫色标出),并如期打印出了 Hello World! 消息(用绿色标出)。此外,我们在镜像中设置的虚拟环境(my_python_dev)已默认加载(黄色标记)。
自定义 VScode 设置
Dev Containers 扩展的一大特点是,它将会话设置与主 VScode 设置隔离开来。这意味着你可以在项目级别完全自定义 VScode 设置。它将开发环境的可重复性扩展到 Python 或操作系统设置之外。最后但并非最不重要的一点是,它使得与他人协作或在多台机器上工作变得无缝而高效。
我们将通过下一个示例结束本教程,在这个示例中,我们将看到如何使用自定义参数定制 VScode 设置。我们将在上一个示例中添加该参数,并使用 vscode 子参数设置环境默认 Python 解释器和所需扩展:
devcontainer.json
{
"name": "Python Development Environment",
"build": {
"dockerfile": "Dockerfile",
"context": ".",
"args": {
"PYTHON_ENV": "my_python_dev"
}
},
"customizations": {
"vscode": {
"settings": {
"python.defaultInterpreterPath": "/opt/my_python_dev/bin/python3",
"python.selectInterpreter": "/opt/my_python_dev/bin/python3"
},
"extensions": [
"ms-python.python",
"ms-toolsai.jupyter"
]
}
}
}
我们使用 settings 参数来定义映像中定义的 Python 虚拟环境。此外,我们使用 extensions 参数来安装支持 Python 和 Jupyter 的扩展。
添加 Python 扩展后,我们就可以使用扩展插件启动 Python 脚本了,如下图所示。此外,我们还可以利用 Juptyer 扩展以交互模式执行 Python 代码:
总结
在本文中,我们回顾了如何使用 VScode 和 Dev Containers 扩展设置一个 dockerized Python 环境。Dev Containers 扩展使容器与开发工作流程的集成变得无缝而高效。我们看到了如何通过几个简单的步骤,使用 devcontainer.json 文件来设置和自定义 docker 化 Python 环境。我们回顾了使用映像和构建参数设置会话映像,以及使用自定义参数设置扩展的两种方法。