2026年设置 Docker 化的 Python 环境 — 优雅的方式

设置 Docker 化的 Python 环境 — 优雅的方式svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



 
  
    
     
      
     
  
    
    

原文:towardsdatascience.com/setting-a-dockerized-python-environment-the-elegant-way-f716ef85571d?source=collection_archive———1———————–#2024-04-02

https://medium.com/@rami.krispin?source=post_page---byline--f716ef85571d--------------------------------https://towardsdatascience.com/?source=post_page---byline--f716ef85571d-------------------------------- Rami Krispin

·发表于 Towards Data Science ·阅读时间 9 分钟·2024 年 4 月 2 日

在上一篇关于此主题的文章中,设置 Docker 化的 Python 环境 — 较为困难的方式,我们讲解了如何通过命令行界面(CLI)设置 Docker 化的 Python 开发环境。在这篇文章中,我们将回顾一种更优雅且更稳健的方法,通过使用 VScode 和 Dev Containers 扩展来设置 Docker 化的 Python 开发环境。

相关文章:

设置 Docker 化的 Python 环境 — 较为困难的方式

本文将回顾通过命令行(CLI)运行 Docker 化的 Python 环境的不同方法。我是否……

towardsdatascience.com

到本教程结束时,你将能够使用 VScode 和 Dev Containers 扩展设置一个简单的 Python 开发环境。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8cbb25bfdc0e8741de15e6c984e79491.png

VScode 插图(由作者使用 Midjourney 创建)

要跟随本教程,你需要准备以下内容:

  • 如果你使用的是 macOS 或 Windows 操作系统,请安装 Docker Desktop(或等效工具);如果你使用的是 Linux 操作系统,请安装 Docker。
  • Docker Hub 账户,用于拉取镜像
  • 安装了 VScode IDE 和 Dev Containers 扩展

在本教程中,我们将使用官方 Python 镜像 — python:3.10

本文中的所有代码示例可以在这里找到:

[ GitHub - RamiKrispin/vscode-python-medium: 支持 Medium 文章的代码

支持 Medium 文章的代码。通过创建账户来贡献 RamiKrispin/vscode-python-medium 的开发…

github.com](https://github.com/RamiKrispin/vscode-python-medium?source=post_page-----f716ef85571d--------------------------------)

在开始之前,让我们解释一下什么是 Dev Containers 扩展,以及何时应该考虑使用它。

简而言之,VScode Dev Containers 扩展使您能够在 Docker 容器内无缝地打开一个隔离的 VScode 会话。隔离的层级包括以下三层:

  • 环境
  • VScode 设置
  • VScode 扩展

devcontainer.json 文件定义了会话设置,使我们能够设置和定义上述三层。

要在容器内设置并启动项目文件夹,使用 Dev Containers 扩展,您需要以下两个组件:

  • 安装 Dev Containers 扩展
  • 在您的项目文件夹中创建一个名为 .devcontainer 的文件夹,并设置一个 devcontainer.json 文件

以下图示描述了 Dev Containers 的总体架构:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fd24fddd18b426e7269fa83217b55ce0.png

Dev Containers 扩展架构(致谢 Rami Krispin)

启动时,Dev Containers 扩展会在容器内启动一个新的 VScode 会话。默认情况下,它会将本地文件夹挂载到容器中,这样可以保持代码的持久性,并与本地文件夹同步。您可以挂载其他文件夹,但这超出了本教程的范围。

在下一部分,我们将看到如何使用 devcontainer.json 文件设置 Python 环境。

在开始使用 devcontainer.json 设置之前,让我们首先定义开发环境的范围。它应包括以下功能:

  • Python 3.10
  • 支持 Jupyter 笔记本
  • 安装所需的库 — Pandas 和 VScode Jupyter 支持库
  • 安装支持的扩展 — Python 和 Jupyter

在接下来的部分,我们将深入探讨 devcontainer.json 文件的核心功能。我们将从一个最简化的 Python 环境开始,展示如何通过添加不同的自定义层来进行定制。

启动一个容器化会话的主要要求是定义镜像设置。设置镜像有两种方法:

  • 在容器启动时使用 build 参数构建镜像并运行。此参数使你能够为构建定义一个 Dockerfile,并将参数传递给 docker build 函数。构建过程完成后,它将启动容器内部的会话
  • 使用 image 参数启动现有镜像的会话

根据不同的使用场景,每种方法都有其优缺点。你应该在镜像完全满足环境需求时考虑使用 image 参数。同样,当你有一个基础镜像,但需要添加一些小的自定义设置时,build 参数是一个很好的选择。

在接下来的部分,我们将通过一个简单的例子开始,使用 image 参数导入官方 Python 镜像(python:3.10)来启动 Python 环境。

以下 devcontainer.json 文件提供了一个简单的示例,用于设置 Python 环境。它使用 image 参数将 python:3.10 镜像定义为会话环境:

devcontainer.json

{ "name": "Python Development Environment", "image": "python:3.10" } 

name 参数定义了环境名称。在此示例中,我们将其设置为 Python 开发环境

在启动环境之前,请确保:

  • 你的 Docker Desktop(或同等软件)已打开
  • 你已登录到 Docker Hub(或提前拉取 Python 镜像)
  • devcontainer.json 文件位于项目文件夹中的 .devcontainer 文件夹下:
. └── .devcontainer └── devcontainer.json 

此示例的代码可在 此处 获取。

要启动会话,请点击左下角的 Dev Container >< 图标,并选择下方截图所示的 Reopen in Container 选项:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9f199cefb98a0b705fb23d9eadfcc058.png

使用 Dev Containers 扩展启动容器内部的会话(作者截图)

请注意,在首次启动会话时,Dev Containers 扩展将查找由 image 参数定义的镜像(在此例中是 python:3.10)。如果镜像在本地不可用,它将从 Docker Hub 拉取,可能需要几分钟时间。之后,启动会话通常只需几秒钟。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b4479a50c69ef05d66d4b3fb.png

容器内的 VScode 会话(作者截图)

在上面的截图中,你可以看到 devcontainer.json 参数与会话设置之间的映射。会话名称现在显示在右下角(紫色标记),并与 name 参数的值对齐。同样,会话现在运行在 python:3.10 容器内,你可以从终端启动 Python。

Python 容器带有默认的 Python 库。在接下来的部分,我们将展示如何通过 build 参数在 Python 基础镜像上添加更多层。

现在,让我们通过修改 devcontainer.json 来定制上述环境。我们将把 image 参数替换为 build 参数。build 参数使我们能够在会话启动时通过 Dockerfile 构建镜像,并向 docker build 函数传递参数。我们将遵循这篇文章中展示的方法来设置 Python 环境:

  • 导入 python:3.10 作为基础镜像
  • 设置虚拟环境
  • 安装所需的库

我们将使用以下 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 镜像,并使用 ARGENV 参数来设置虚拟环境作为参数和环境变量。此外,我们还使用以下两个辅助文件来设置虚拟环境并安装所需的库:

  • requirements.txt — 一个设置文件,其中列出了所需的库。在本演示中,我们将安装 Pandas 库(版本 2.0.3)和 Jupyter 支持库(ipykernel、ipywidgets、jupyter)。wheels 库是一个支持库,用于处理 C 依赖关系。
  • set_python_env.sh — 一个辅助的 Bash 脚本,用于设置虚拟环境并通过 requirements.txt 文件安装所需的库

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 文件中进行修改,将 image 参数替换为 build 参数:

devcontainer.json

{ "name": "Python Development Environment", "build": { "dockerfile": "Dockerfile", "context": ".", "args": { "PYTHON_ENV": "my_python_dev" } } } 

本示例的文件可以在这里找到。

build 子参数使我们能够通过向 docker build 函数传递参数来自定义镜像构建。我们使用以下参数来构建镜像:

  • dockerfile — Dockerfile 的路径和名称
  • context — 设置本地文件系统的路径,以便在构建时通过 COPY 参数访问文件。在这种情况下,我们使用 devcontainer.json 文件的当前文件夹(例如 .devcontainer 文件夹)。
  • args — 在构建过程中设置并传递参数给容器。我们使用 PYTHON_ENV 参数来设置虚拟环境并命名为 my_python_dev

你应该将这三个文件 — Dockerfilerequirements.txtset_python_env.sh 存储在 .devcontainer 文件夹下,并与 devcontainer.json 文件一起使用:

. ├── .devcontainer │ ├── Dockerfile │ ├── devcontainer.json │ ├── requirements.txt │ └── set_python_env.sh └── test2.py 

现在,让我们使用新设置启动会话,并使用 test1.py 文件进行测试:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/839afb5683f5adfe2c5732bd9a28f5bd.png

运行一个 Python 脚本以测试环境(截图来自作者)

如上图所示,我们成功地从终端(标记为紫色)运行了测试脚本,并且它按预期打印出了Hello World!消息(标记为绿色)。此外,我们在镜像中设置的虚拟环境(my_python_dev)默认已加载(标记为黄色)。

在下一部分中,我们将看到如何自定义 Dev Containers 会话的 VScode 设置。

Dev Containers 扩展的一个重要特点是,它将会话设置与主要的 VScode 设置隔离开来。这意味着你可以在项目级别完全自定义 VScode 设置。它扩展了开发环境的可复现性,不仅限于 Python 或操作系统设置。最后但同样重要的是,它使得与他人协作或在多台机器上工作变得无缝且高效。

我们将在接下来的示例中结束本教程,看看如何使用customizations参数自定义 VScode 设置。我们将向前面的示例添加该参数,并使用vscode子参数设置环境默认的 Python 解释器和所需的扩展:

devcontainer.json

{ "name": "Python Development Environment", "build": { "dockerfile": "Dockerfile", "context": ".", "args": { "PYTHON_ENV": "my_python_dev" } }, "customizations": , "extensions": [ "ms-python.python", "ms-toolsai.jupyter" ] } } } 

该示例的文件可以在这里找到。

我们使用settings参数来定义镜像中定义的 Python 虚拟环境。此外,我们使用extensions参数安装Python和Jupyter支持扩展。

注意: 虚拟环境的路径由用于设置环境的应用程序类型定义。当我们使用venv并将其命名为my_python_dev时,路径为opt/my_python_dev/bin/python3

在添加 Python 扩展后,我们可以使用扩展插件启动 Python 脚本,如下图所示。此外,我们还可以利用 Jupyter 扩展以交互模式执行 Python 代码:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4c8bda14019b0f7f505bb1532d14321c.png

在本教程中,我们回顾了如何使用 VScode 和 Dev Containers 扩展设置一个 Docker 化的 Python 环境。Dev Containers 扩展使得容器与开发工作流的集成变得无缝且高效。我们了解了如何通过几个简单的步骤,使用devcontainer.json文件来设置和自定义 Docker 化的 Python 环境。我们回顾了两种设置会话镜像的方法:通过imagebuild参数,以及通过customizations参数来设置扩展。还有其他自定义选项未在本教程中涉及,我建议查看这些选项:

  • 定义环境变量
  • 挂载额外的卷
  • 设置docker run命令的参数
  • 启动后运行命令

如果你有兴趣深入了解更多细节,我推荐查看这个教程:

[ GitHub - RamiKrispin/vscode-python: 使用 VScode 和 Docker 设置 Python 开发环境的教程…

使用 VScode 和 Docker 设置 Python 开发环境的教程 - RamiKrispin/vscode-python

github.com](https://github.com/RamiKrispin/vscode-python?source=post_page-----f716ef85571d--------------------------------)

  • 代码示例 — github.com/RamiKrispin/vscode-python-medium
  • VScode — code.visualstudio.com/
  • 开发容器 — code.visualstudio.com/docs/devcontainers/containers
  • 设置一个 Docker 化的 Python 开发环境,使用 GitHub 模板 — medium.com/@rami.krispin/setting-a-dockerized-python-development-environment-template-de2400c4812b

小讯
上一篇 2026-04-12 19:40
下一篇 2026-04-12 19:38

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/252442.html