设置Docker化的Python环境分布指南

2024年04月07日 由 alex 发表 306 0

先决条件

要学习本教程,你将需要以下内容:


  • 如果你使用的是 macOS 或 Windows 操作系统计算机,则使用 Docker Desktop(或同等版本);如果你使用的是 Linux 操作系统,则安装 Docker
  • 用于从中提取映像的 Docker Hub 帐户
  • VScode IDE和已安装的Dev Containers扩展


在本文中,我们将使用官方 Python 映像 — python:3.10.


开发容器扩展

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


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


  • 环境
  • VScode 设置
  • VScode扩展


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


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


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


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


14


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


设置 Docker 化 Python 环境

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


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


在下面的章节中,我们将深入研究 devcontainer.json 文件的核心功能。我们将从一个简约的 Python 环境开始,并演示如何通过添加不同的自定义层来定制它。


构建与映像

使用 Dev Containers 扩展启动容器化会话的主要要求是定义映像设置。有两种设置映像的方法:


  • 使用构建参数构建镜像并在容器启动时运行。通过该参数,你可以定义用于构建的 Dockerfile,并将参数传递给 docker build 函数。构建过程完成后,它将在容器内启动会话
  • 使用 image 参数用现有的镜像启动会话


根据不同的使用情况,每种方法都各有利弊。如果已有完全符合环境要求的映像,则应考虑使用映像参数。同样,当你有一个基础镜像,但需要添加一些小的自定义设置时,也可以使用构建参数。


基本的 Docker 化 Python 环境

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


devcontainer.json


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


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


启动环境前,请确保:


  • 你的 Docker 桌面(或类似设备)已打开
  • 你已登录 Docker Hub(或提前拉入 Python 映像)
  • 在 .devcontainer 文件夹下的项目文件夹中设置了 devcontainer.json 文件:


.
└── .devcontainer
    └── devcontainer.json


要启动会话,请单击左下角的 Dev Container >< 符号,然后选择 "在容器中重新打开"(Reopen in Container)选项,如下图所示:


nbbbb


请注意,在会话首次启动时,Dev Containers 扩展会查找 image 参数定义的映像(本例中为 python:3.10)。如果本地没有可用的映像,它会从 Docker Hub 中提取,这可能需要几分钟时间。之后,启动会话只需几秒钟。


16


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


Python 容器自带了默认的 Python 库。


使用 Dockerfile 自定义 Python 环境

现在,让我们通过修改 devcontainer.json 来定制上述环境。我们将用 build 参数替换 image 参数。通过 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 映像,使用 ARG 和 ENVarguments 将虚拟环境设置为参数和环境变量。此外,我们还使用以下两个辅助文件来设置虚拟环境和安装所需的库:


  • requirements.txt - 包含所需程序库列表的设置文件。在本演示中,我们将安装 2.0.3 版的 Pandas 库和 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 文件进行修改,用构建参数替换图像参数:


devcontainer.json


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


通过向 docker build 函数传递参数,构建子参数(build subarguments)可以让我们自定义镜像的构建。我们使用以下参数来构建镜像:


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


你应该将 Dockerfile、requirements.txt 和 set_python_env.sh 这三个文件与 devcontainer.json 文件一起保存在 .devcontainer 文件夹下:


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


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


17


从上面的截图中可以看到,我们成功地从终端运行了测试脚本(用紫色标出),并如期打印出了 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 代码:


屏幕截图2024-04-07110722


总结

在本文中,我们回顾了如何使用 VScode 和 Dev Containers 扩展设置一个 dockerized Python 环境。Dev Containers 扩展使容器与开发工作流程的集成变得无缝而高效。我们看到了如何通过几个简单的步骤,使用 devcontainer.json 文件来设置和自定义 docker 化 Python 环境。我们回顾了使用映像和构建参数设置会话映像,以及使用自定义参数设置扩展的两种方法。



文章来源:https://medium.com/towards-data-science/setting-a-dockerized-python-environment-the-elegant-way-f716ef85571d
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消