如何搭建Python环境并使用Docker镜像构建项目依赖包
目录

一、搭建python环境的镜像
把项目依赖包导出到一个文件中,这个文件名为 requirements.txt,该文件名称可随意设定。
pip freeze > requirements.txt
(2)新建文件夹app,
在宿主机上新建一个目录,我的目录在/app 。接着把 requirements.txt 文件复制到新建的目录中,该文件的内容如下:
在 app 目录中创建一个名为 Dockerfile 的文件(注意文件名就是 Dockerfile,没有后缀),其内容以及解释如下:
FROM python:3.9
WORKDIR /app
ADD requirements.txt /app
RUN pip install --upgrade pip
运行 pip 命令来安装 requirements.txt 文件,安装源设置为 https://pypi.tuna.tsinghua.edu.cn/simple
以 python:3.9 为基础来构建镜像。
WORKDIR /app #切换换工作空间
将 python 项目的依赖包添加到镜像,具体是添加 requirements.txt 到 /app 路径下。
运行 pip install --upgrade pip 这个命令,其目的是安装依赖包。
运行 pip 安装 -r requirements.txt ,并通过 -i https://pypi.tuna.tsinghua.edu.cn/simple 来指定源 ,以安装依赖包
构建 Docker 镜像:于项目的根目录处执行相应命令来构建 Docker 镜像;在 app 目录下执行镜像构建的命令。
cd app
使用 docker 进行构建操作,将标签设置为 a4-1:5000/xxx/py39_1:py39,构建的上下文路径为当前目录.
(4)构建成功后,通过下行命令就会看到一个新的镜像,
docker images
(5)创建一个python容器并查看依赖包是否安装成功,
docker 运行一个容器,容器的 ID 是通过 -id 参数指定的,同时给这个容器命名为 test_env,使用的镜像为 a4-1:5000/xxx/py39_1:py39,并且在容器启动后执行 /bin/bash 命令。
进入容器,然后查看之前安装过的 python 第三方库包是否还存在。
使用 docker 执行命令,进入交互模式,以用户 ID 为 0 的身份在 test_env 环境中执行 /bin/sh 命令。具体为通过 docker exec 命令,加上 -it 参数表示进入交互模式,-u 0 表示以用户 ID 为 0 执行,后面跟上要进入的环境 test_env 以及要执行的命令 /bin/sh 。
如果有没安装上的依赖包,那么可以在 student_env 容器中自行进行安装。
使用 pip 安装依赖包,指定版本,通过 -i 参数指定源为 http://pypi.douban.com/simple/,并使用 --trusted-host 参数信任 pypi.douban.com 这个主机
可以用“exit”或者“ctrl+p+q”命令,退出容器,
二、导出镜像 使用 docker save 命令
docker save 命令可用于把一个或多个镜像保存进一个 tar 归档文件里。此命令很适合用于镜像的备份,也适合将镜像从一个 Docker 环境迁移至另一个 Docker 环境。
命令格式及参数解释
使用 docker save 命令时可以加上 OPTIONS 选项,然后指定要保存的 IMAGE 或者多个 IMAGE 。
这个命令会把 a4-1:5000/xxx/py39_1:py39 这个镜像保存成 py39_1.tar 文件。该文件涵盖了镜像的所有层,也包含了标签以及元数据,从而保证了镜像信息的完整性。
使用 docker 进行保存操作,将其保存为 py39_1.tar 文件,具体的是对 a4-1:5000/xxx/py39_1:py39 进行保存操作
通过“ls”命令,可以在当前文件夹目录下看到这个压缩包,
三、导入镜像
(1)
使用 docker load 命令
docker load 命令的作用是加载由 docker save 命令所保存的镜像归档文件。该命令能够恢复镜像的所有层,同时也能恢复其标签和元数据。
命令格式及参数解释:
docker load [OPTIONS]
接下来,我们把 py39_1.tar 文件传输至测试环境的服务器。在测试环境的服务器那儿,我们运用 docker load 命令去导入这个镜像。
使用 docker 命令进行加载操作,加载的输入源是 py39_1.tar 这个文件。具体来说,就是执行 docker load 命令,并通过 --input 参数指定要加载的文件为 py39_1.tar 。
执行这个命令后,myapp:latest 镜像会被加载至测试环境的 Docker 里。它保留了导出时的全部信息,这些信息包含了镜像的所有层以及元数据。
我的 docker 中已经存在一个具有该名称的镜像,因此在导入镜像时需要对其进行重命名。
当你在 Docker 中导入一个镜像时,如果你的系统中已经存在与即将导入的镜像具有相同名称和标签的镜像,那么你可以有几个选项来处理这种情况: 你可以选择保留已存在的镜像; 你可以选择删除已存在的镜像; 你也可以选择将即将导入的镜像重命名以避免冲突。
如果你不介意替换已有的镜像,那么可以直接使用 docker load 导入新镜像,之后让新镜像覆盖现有的标签。需注意,此操作会使原有的镜像被新的镜像内容所替换,不过镜像的 ID 会进行更新。
给新导入的镜像重新命名:倘若你希望既保留现有的镜像,又能同时使用新的镜像,那么在导入之后,即刻可以通过 docker tag 为新镜像赋予一个别样的标签或者仓库名。如此一来,这两个镜像便能够一同存在,各自拥有不同的标签。
假设原有的镜像标签是 existingimage:latest,你导入的镜像也有相同标签,那么你可以进行如下操作:
docker 将 existingimage:latest 标记为 newimage:latest 。
如果你确定新的镜像应替换旧的镜像且想彻底移除旧镜像,那么可以先进行旧镜像的删除操作,接着再导入新镜像。需注意,此操作需谨慎,因为一旦删除镜像,所有依赖该镜像的容器将无法运行。
2. 执行 docker load 命令来加载镜像。< example.tar
使用不同的标签进行导入:如果可行,能够修改镜像的 tar 存档文件,在导入之前重新打上标签,如此一来,在导入时就已经带有新的标签了。这一般会涉及对镜像存档的元数据进行修改,或许会比较复杂,但可用于避免标签冲突。
选择某种方法与你对现有镜像以及新镜像的需求有关,也与你对 Docker 系统的管理策略相关。一般来说,为防止意外覆盖,最好使用第二种方法,即重命名新导入的镜像,这样能让环境保持清晰且安全。
输入下行命令:
docker 给 a4-1:5000/yantianzi/py39_1 打上标签,将其标记为 py39,同时把 py39_1 重命名为 newname
(3)然后查询docker里的镜像,
docker images |grep py39_
OK,成功了。