如何使用 Miniconda Docker 化 Python 应用程序 [A Hybrid Approach]

如果您熟悉 Docker,您可能知道可以使用 Dockerfile 创建自定义 docker 镜像。 我已经写得很详细了。

在本教程中,我将向您展示如何遵循相同的想法,但仅适用于 Python 应用程序。 这对用户和开发人员都有用。

我将使用最小的 Python 图像。 一旦您修改和修改了该图像,您将不再需要担心在不同的操作系统上安装您的 Python 应用程序。 您将能够每次都使用 Docker 直接运行您的 Python 应用程序。 因此,您可以告别那些基于主机的安装问题!

为您的 Python 应用程序创建 docker 映像

我将在这里使用 Miniconda。 迷你康达 是一个免费的最小安装程序 康达 并为您提供了一个小型的、引导版本的 Anaconda,其中包含运行 Python 应用程序所需的基本必需品。

为什么选择迷你康达?

原因不止一个:

在主机上安装 Miniconda 时,实际上并没有使用操作系统包管理器提供的 Python 版本。 Miniconda 安装在具有自己的 Python 环境的单独位置。 因此,当在 Docker 容器上完成时,这为您提供了更高级别的隔离。

由于以上几点,您还获得了另一个优势:由于您使用的是 conda 如果安装了 Miniconda,您可以在需要时使用此工具更改应用程序的相关 Python 版本。 这对于基于不同版本的 Python 3 的应用程序开发人员来说是一个巨大的帮助:它们也可能是 3.6、3.7、3.8、3.9 或更早版本。

为了 example,如果默认情况下您运行的是 Python 3.9,但您的 Python 应用程序由于相关的依赖关系而需要 Python 3.7,您会怎么做?

这是哪里 conda 可以帮你。 有了它,你可以运行 conda install python=3.7 通过安装所需的所有依赖项来更改所需的 Python 版本。

  • Miniconda 允许您安装 Python 2 和 Python 3 应用程序。 尽管 Python 2 正式死亡,您仍然可以在此环境之上测试旧应用程序,而无需使用 2到3.
  • 还有许多用例,在 Miniconda 上运行的 Python 应用程序会寻找非 Python 主机端依赖项(例如 example g++)。 这就是 Miniconda 和 Docker 的强大组合成为一个很好的解决方案的时候!
  • 我忘了提到你还可以创建和激活你自己的 Python 应用程序环境 conda? 再次隔离!
  • 在任何时候,您都可以选择在 Docker 容器的默认 Python 版本和 Miniconda 之间切换。 这为您提供了更大的灵活性,因为您可以随时使用更改重建新图像。

那么,现在让我们继续使用 Miniconda 和 Docker 创建新的 Python 应用程序映像吧!

先决条件

如果您还没有,请在 Ubuntu 或您使用的任何 Linux 发行版上安装 Docker。 确保将自己添加到 docker 组,这样您就可以在没有 sudo. 您需要一个有效的 Internet 连接来下载基础 Docker 映像。

对于示例 Python 应用程序,我使用的是简单的“Hello World!” example 命名为 python-app.py让您更容易理解如何在 Docker 上通过 Miniconda 运行它。

使用不同 Python 库的成熟 Python 应用程序将极大地受益于相同的过程,特别是因为 Miniconda 的各种依赖项规定。

第一步:获取 Docker 镜像 [optional]

我在这个选择了 Python Slim example 代替 高山 Linux. 后者确实很小,但可以极大地影响 表现 当涉及到运行应用程序时。 但是,基于 Debian Buster 和 Python 3.9.1,Python Slim 大小约为 40 MB。

此步骤是可选的。 我包含它是为了表明您可以将它与之前的 Dockerfile 教程中的自定义 python 应用程序映像进行比较。

使用 Python Slim 拉取最新的 docker 镜像 docker pull 命令:

docker pull python:slim

第 2 步:使用所需的自定义创建 Dockerfile

现在让我们使用 touch 命令创建一个名为 Dockerfile 的新空文件。 但首先为您的 docker 应用程序创建一个目录。

mkdir python-docker
cd python-docker
touch Dockerfile

在我通过文件的逐步演练解释了映像构建过程中的步骤之后,我将在下面附上完整的 Dockerfile。

以下是如何开始和推进构建图像:

准备基础镜像

使用 Python Slim 作为基础镜像来更新最新的默认包。

FROM python:slim
RUN apt-get update && apt-get -y upgrade 

安装非 Python 包依赖项

为您的 Python 应用程序安装任何非 Python 依赖项(例如 g++ 和任何其他根据您的要求)。

  && apt-get install -y --no-install-recommends 
    git 
    wget 
    g++ 
    gcc 
    ca-certificates 
    && rm -rf /var/lib/apt/lists/*

吉特wget 从不同的存储库和 URL 获取 Python 应用程序时非常方便。 最后,清理一些空间 rm -rf /var/lib/apt/lists/* 用于最小化最终的 Docker 镜像大小。

安装 Miniconda

安装后,Miniconda 更新 .bashrc 切换到自己的 Python 版本。

ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
    && mkdir /root/.conda 
    && bash Miniconda3-latest-Linux-x86_64.sh -b 
    && rm -f Miniconda3-latest-Linux-x86_64.sh 

这里在容器系统路径中设置了一个环境变量。 ENV 适用于您将在映像上运行的容器,并且 ARG 用于首次构建时创建的中间容器。

所以,两者的区别 ENVARG 上述代码块中的说明是后者仅在构建映像时可用。 看看这个美丽的解释 这里.

wget,从官方 Anaconda 存储库下载最新版本的 Miniconda。 创建基本配置目录后,安装它,最后删除安装程序。

将 Miniconda 配置到 Bash Shell

安装 Miniconda 后,显示其版本号以进行确认并将其初始化为 Bash shell 对于容器. 第二行 更新 你的默认 .bashrc 文件:

	&& echo "Running $(conda --version)" && 
    conda init bash && 

使用新更改重新加载 Bash

为 Docker 构建系统重新加载 Bash 以切换到 Miniconda Python 版本而不是 Debian(基本操作系统映像)。

	. /root/.bashrc && 

此外,更新默认捆绑的当前 Miniconda 软件包。

	conda update conda && 

为您的应用准备 Conda 环境

为您的 Python 应用程序创建并激活一个单独的 Conda 环境。

    conda create -n python-app && 
    conda activate python-app && 

安装应用所需的相关 Python 版本。 假设您的应用程序基于 Python 3.6,请在新的虚拟环境中设置此版本以及 ,这在管理 Python 应用程序时也非常方便。

    conda install python=3.6 pip && 

安装你的 Python 应用程序

根据您使用应用程序的方式,您可以:

一世。 用 pip 安装传统上 使用 setup.py 存储库中可用的文件。 它与讨论的工具相同 早些时候 但在这里我通过 Conda 使用它。

	git clone replace-me-with-repo-url
	cd repo-name
	pip install -e .

ii. ..或直接使用 python 命令:

	git clone replace-me-with-repo-url
	cd repo-name
	python python-app.py

在演示 Dockerfile 中,我将使用“Hello World!” example 让您更容易理解如何通过启动容器或在其内部直接运行它 bash 带有 Docker 的外壳。 所以,假设我使用的是第二种方式:

    echo 'print("Hello World!")' > python-app.py

所以现在我已经包含了上面的行,一个名为 python-app.py 被创建,它应该在您使用命令执行时生成 Hello World 消息 python python-app.py.

像 Miniconda 一样为您的应用更新 .bashrc 文件:

Miniconda 安装程序会在您运行后自动更新 .bashrc 文件 conda init bash 如前所示。 您也可以对您的 Python 应用程序执行相同的操作。 每当你运行容器 bash,环境将被激活,您也可以使用您的 Python 应用程序名称作为命令来运行它。 在这里,我使用的名称为 python-app

RUN echo 'conda activate python-app n
alias python-app="python python-app.py"' >> /root/.bashrc

准备应用程序以进行最终执行

最后,我创建一个入口点并分配​​命令,使您能够在每次基于此映像运行容器时运行它:

ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

完整的 Dockerfile

您可以使用 Vim 之类的编辑器或 纳米 或使用 cat 命令将上面讨论的行添加到 Dockerfile。

FROM python:slim
RUN apt-get update && apt-get -y upgrade 
  && apt-get install -y --no-install-recommends 
    git 
    wget 
    g++ 
    ca-certificates 
    && rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 
    && mkdir /root/.conda 
    && bash Miniconda3-latest-Linux-x86_64.sh -b 
    && rm -f Miniconda3-latest-Linux-x86_64.sh 
    && echo "Running $(conda --version)" && 
    conda init bash && 
    . /root/.bashrc && 
    conda update conda && 
    conda create -n python-app && 
    conda activate python-app && 
    conda install python=3.6 pip && 
    echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app n
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]

当您尝试自己的应用程序时,请更换 echo 'print("Hello World!")' > python-app.py 使用上面安装 Python 应用程序部分中描述的两种方法中的任何一种。

第 3 步:使用 Dockerfile 构建 Python 应用程序映像

您可能已经知道,从 Dockerfile 构建修改后的 Docker 映像的命令如下所示:

docker build -t python-app PATH_to_Dockerfile

使用 -t 标记,您可以指定应用程序的 Docker 映像的名称。 我已将其设置为 python-app 在上面 example 命令。

考虑到 Dockerfile 位于您的当前目录中,您可以像这样创建 Python 应用程序的新 Docker 映像:

docker build -t python-app .
[email protected]:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon   2.56kB
Step 1/8 : FROM python:slim
 ---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade   && apt-get install -y --no-install-recommends     git     wget     g++     ca-certificates     && rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:${PATH}"
 ---> Using cache
 ---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh     && mkdir /root/.conda     && bash Miniconda3-latest-Linux-x86_64.sh -b     && rm -f Miniconda3-latest-Linux-x86_64.sh     && echo "Running $(conda --version)" &&     conda init bash &&     . /root/.bashrc &&     conda update conda &&     conda create -n python-app &&     conda activate python-app &&     conda install python=3.6 pip &&     echo 'print("Hello World!")' > python-app.py
 ---> Using cache
 ---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app nalias python-app="python python-app.py"' >> /root/.bashrc
 ---> Running in e3193e93b631
Removing intermediate container e3193e93b631
 ---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
 ---> Running in 621624951dcf
Removing intermediate container 621624951dcf
 ---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
 ---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
 ---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest

上面的输出是基于缓存的数据,但是当你第一次运行它时,它会花费一些时间并且产生更长的日志输出。

现在,让我们验证您修改后的 Docker 映像是否具有 example 通过从中运行容器安装的应用程序:

docker run python-app
[email protected]:~/python-docker$ docker run python-app
Hello World!

因此,通过 Docker 和 Miniconda,您现在可以直接运行程序,而无需任何事先安装! 从现在开始,您所需要的只是图像。

现在让我们登录 bash 此容器内的外壳:

docker run -ti python-app bash
[email protected]:~/python-docker$ docker run -ti python-app bash
(python-app) [email protected]:/# 

如您所见,您现在位于之前通过 Dockerfile 创建的 Conda 激活环境中。 这 -ti flag 用于为您创建交互式终端。 您现在也可以使用别名命令来运行应用程序:

(python-app) [email protected]:/# python-app
Hello World!

我们还要确认您确实使用的是 Miniconda Python 版本,而不是默认的 Python 版本:

(python-app) [email protected]:/# python --version
Python 3.6.12 :: Anaconda, Inc.

正如我之前提到的,Miniconda 是 蟒蛇.

一切准备就绪后,您就可以 你的最终形象 码头工人中心 如果您在 GitHub, GitLab, 吉蒂亚, 比特桶 或任何其他存储库。

Exit 通过在终端中键入 exit 来创建容器。 停止容器,移除容器并移除 Docker 镜像(如果需要)以释放磁盘空间。

恭喜! 您刚刚学习了如何为您的 Python 应用程序创建您自己的 Docker 映像。

是不是对您有帮助?

所以你看,Miniconda 不仅帮助你使你的应用程序在用户级别上更加灵活和面向未来,它还使开发人员的角色变得更加容易。

想想这有多方便 设置这个PyCharm! 您可以像在主机系统上一样安装 Miniconda 和 Python 应用程序,但是由于您将其构建并保存为 Docker 映像,因此它只是一个一次性过程!

如果需要,您可以尝试使用上一教程中显示的不同示例,而不是“Hello World!”。 example 我在这个中使用过。

希望这可以帮助! 如果您有任何问题或建议,请在下方发表评论。