Docker系列四DockerFile打造Python镜像
off999 2024-10-14 12:05 37 浏览 0 评论
前言
起因是在更新博客的时候,发现可以用更优雅的方式来实现原有的目的,所以重新整理后,将原文改成了了两篇,都收录在了该系列中。
构建Docker镜像,简单来说分为以下两种:
- 拉取CentOS的操作系统镜像并生成容器,然后在里面安装各种需要的环境,诸如SSH、Python等。好处就是容器内东西够多,几乎就是又一台服务器,想怎么玩都行。坏处就是吃机子服务器的性能,以我之前的某次作死为例,光镜像文件就得四个G,哪怕是备份文件也得七百兆起步。/捂脸
- 直接拉取Python镜像,简单粗暴,当然,也是需要自己手动安装各种环境的。好处就是容器偏小,备份和恢复起来较为方便。
我接下来会介绍如何将Python项目使用DockerFile创建成为镜像,此时又根据项目的复杂程度,分为单文件和多文件的两种情况。
运行一次性的python脚本
首先编写一个基础脚本test.py。
#!/usr/bin/python
import sys
print(sys.version)
print("Hello, World!")
将脚本test.py放入指定的目录/home/keen/docker/python3.7,运行得到结果后,再删除镜像。
export Temp=python-temp
# 运行容器
docker run \
--name $Temp \
-v /home/keen/docker/python3.7:/usr/src/myapp \
-v /etc/localtime:/etc/localtime:ro \
-w /usr/src/myapp \
python:3.7-slim-buster \
python3 test.py
#删除并销毁容器
docker stop $Temp && docker rm $Temp
但是有前提,必须这个脚本所需要的环境是存在于镜像中的,否则在里面运行会报错的。但是一般来说,官方镜像里面很难保证会有我们编写代码的所有依赖,所以必须要考虑在容器中新增指定依赖。但是总不能每次新启动容器就要重新下一遍依赖吧。
易经上说,穷则变,变则通,通则久。在这里不敢说长久能用,但是努把劲儿,至少得不穷了吧?
单文件创建镜像
适用于单文件创建镜像,一般是新手练手用,或者是功能真的很简单,只需要一个文件就能实现所有功能。
项目文件路径
任意路径建立一个文件夹,此时文件夹名称可以随意起名,我这里做例子起名为test1,跟多文件创建镜像的文件夹分开。
接下来使用命令创建文件夹和文件。其中keen_test1.py是我们的脚本文件,requirements.txt则是依赖和依赖的版本,Dockerfile指定了生成镜像的配置和运行命令。
# 创建文件夹
mkdir -p /home/keen/docker/test1/
# 生成脚本文件
touch /home/keen/docker/test1/keen_test1.py
# 生成依赖文件
touch /home/keen/docker/test1/requirements.txt
# 生成Dockerfile文件
touch /home/keen/docker/test1/Dockerfile
编写脚本文件
编写一个基础脚本keen_test.py,假设会需要引用第三方依赖,且会将计算结果保存到容器的绝对路径/out/中。
vim /home/keen/docker/test1/keen_test.py
脚本内容如下。
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.01)
y = x**2
plt.plot(x, y)
# 将图片保存到容器的绝对路径/out/中
plt.savefig("/out/b.png")
# 将变量保存到文件
log = open("/out/a.txt",mode="a",encoding="utf-8")
print(x,file = log)
print(y,file = log)
log.close()
编写依赖文件
这个样例简单么,所以手动编写requirements.txt文件。
vim /home/keen/docker/test1/requirements.txt
依赖内容如下。
numpy==1.21.3
matplotlib==3.4.3
编写Dockerfile文件
编写Dockerfile文件新建镜像,是需要一个镜像作为基础,然后基于此继续构建新容器。比如此次我就是基于python:3.7的镜像来搭建新镜像,但是即使本地没有这个镜像也不用提前拉取,因为docker会自动拉取的。
vim /home/keen/docker/test1/Dockerfile
文件内容如下。
# syntax=docker/dockerfile:1
# 第一行是解析器指令,始终用版本1语法的最新版本
#基础镜像
FROM python:3.7-slim-buster
# 设置工作目录文件夹
WORKDIR /code
# 复制依赖文件
COPY requirements.txt requirements.txt
# 安装依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 复制其他的脚本文件
COPY . .
#当启动容器时候,执行change_step.py程序
CMD ["python", "keen_test.py"]
- # syntax=docker/dockerfile:1:别看第一个字符是#就以为他是注释,也可能是解释器指令,意义是使用dockerfile版本1的语法来运行当前脚本
- FROM 镜像名称:版本号 :指明基础镜像
- WORKDIR:指明工作目录
- COPY :将宿主机的文件复制到镜像中
- RUN :运行后面的命令,实现将安装依赖。
- CMD:这是将镜像打包完并且生成镜像成功后才会运行的命令。
生成镜像
生成docker镜像,其中--tag会指明镜像名称和版本号。
docker build \
--tag keen-dockerfiletest:1.0.3 \
/home/keen/docker/test1
用镜像生成容器
创建并且运行容器,在当前目录新建out文件夹,并且将之映射成为容器的out文件夹。
docker run \
-v ${PWD}/out:/out \
keen-dockerfiletest:1.0.3
项目级创建Python镜像
这个则是部署Python项目的时候,用的多些。其实与上面相比,只不过是项目文件会出现层级,在Dockerfile里面要特别地指明添加哪些项目中的哪些内容。
项目文件路径
我这里做例子起名为test2,跟单文件创建镜像的文件夹分开。
接下来使用命令创建文件夹和文件。其中branch1下面的__init__.py是为了把这个文件夹声明成为包。
# 创建文件夹
mkdir -p /home/keen/docker/test2/
# 创建文件夹,并声明为包
mkdir -p /home/keen/docker/test2/branch1/
touch /home/keen/docker/test2/branch1/__init__.py
# 生成脚本文件
touch /home/keen/docker/test2/branch1/keen_test1.py
touch /home/keen/docker/test2/keen_test2.py
touch /home/keen/docker/test2/keen_test3.py
# 生成依赖文件
touch /home/keen/docker/test2/requirements.txt
# 生成Dockerfile文件
touch /home/keen/docker/test2/Dockerfile
编写脚本文件
总共要写三个脚本文件,第一个脚本文件存在一个方法,方法体是写信息进入TXT文件;第二个脚本文件是调用第三方库计算并生成图片,并且调用第一个脚本的方法;第三个文件是多余的,不应该被引入到镜像中的文件。
vim /home/keen/docker/test2/branch1/keen_test1.py
vim /home/keen/docker/test2/keen_test2.py
脚本文件keen_test1内容如下。
#!/usr/bin/python
class Keen:
def keen_say(self):
log = open("/out/a.txt",mode="a",encoding="utf-8")
print("keen_test1",file = log)
log.close()
脚本文件keen_test2内容如下。
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.01)
y = x**2
plt.plot(x, y)
# 将图片保存到容器的绝对路径/out/中
plt.savefig("/out/b.png")
# 查看文件和文件夹
import os
print(os.listdir())
# 调用方法
from branch1.keen_test1 import Keen
p = Keen()
p.keen_say()
脚本文件keen_test3没有内容,但是生成的容器里面不应该有这个文件
编写依赖文件
这个样例简单么,所以手动编写requirements.txt文件。
vim /home/keen/docker/test2/requirements.txt
依赖内容:
numpy==1.21.3
matplotlib==3.4.3
编写Dockerfile文件
编写Dockerfile文件新建镜像,是需要一个镜像作为基础,然后基于此继续构建新容器。比如此次我就是基于python:3.7的镜像来搭建新镜像,但是即使本地没有这个镜像也不用提前拉取,因为docker会自动拉取的。
vim /home/keen/docker/test2/Dockerfile
文件内容:
# syntax=docker/dockerfile:1
# 第一行是解析器指令,始终用版本1语法的最新版本
#基础镜像
FROM python:3.7-slim-buster
# 设置工作目录文件夹
WORKDIR /code
# 复制依赖文件
COPY requirements.txt requirements.txt
# 安装依赖
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
#将文件添加到文件夹中,一个一个复制其实也可以的
ADD ./branch1/keen_test1.py /code/branch1/
ADD ./branch1/__init__.py /code/branch1/
ADD ./keen_test2.py /code/
#当启动容器时候,执行change_step.py程序
CMD ["python", "keen_test2.py"]
- ADD:将指定的文件复制到镜像的指定目录中
生成镜像
生成docker镜像,其中--tag会指明镜像名称和版本号。
docker build \
--tag keen-dockerfiletest:1.0.5 \
/home/keen/docker/test2
用镜像生成容器
创建并且运行容器,在当前目录新建out文件夹,并且将之映射成为容器的out文件夹。
docker run \
-it \
-v ${PWD}/out:/out \
keen-dockerfiletest:1.0.5
感谢
感谢现在的好奇,为了能成为更好的自己。
用DockerFile生成python镜像
相关推荐
-
- 内存清理大师(内存清理大师V1.2.6官方版)
-
1、打开手机清理大师应用APP2、点击扫描垃圾3、在弹出来的窗口点击清理垃圾4、最后即可清理完成在手机中设置里的通用里储存空间与iCloud进行清除。操作方法点开设置->通用->储存空间与iCloud用量点击储存空间-...
-
2026-01-23 17:03 off999
- 登录器下载安装(云端辅助登录器下载安装)
-
有其他的程序正在使用中,你电脑重新启动一次再删除dlq试试,或者把其他的程序都关了然后再重新安装一次再删除.祝你好运!!!!!!!!!!!!1国服的下载很简单,和当年CF、逆战的方式一样,我们直接...
-
- 下载拼音打字输入法(下载拼音汉字输入法)
-
你下载百度手机输入法,默认的就是双拼,可以自己选择26键拼音输入、右键单击桌面右下角的搜狗输入法工具条,将鼠标移到“软键盘”上,然后选择“拼音字母”即可使用这个功能。输入法使用技巧:1、输入法一般支持符号输入,可以右键单击候选框,之后点击“...
-
2026-01-23 16:43 off999
- 彩铃定制(彩铃定制流程)
-
演示品牌型号:联想拯救者R720;系统:Windows10;软件:Chrome88.0。1、用浏览器搜索定制手机彩铃,点击移动官网,进入后点击左上角登录,账户就是自己的手机号,密码就是在营业厅办理需要...
- 同他聊交友软件(他聊软件吗)
-
好他聊app一款优质便捷的单身男女在线互动交友平台,来他聊app遇见更多有趣有料的小伙伴,支持语音通话视频互动,更可以每日分享生活动态。他聊app你可以通过文字、语音、视频等多种方式与同城附近异性聊天...
- 360官方(360官方正版免费下载安装)
-
https://yunpan.360.cn/360云盘是奇虎360科技的分享式云存储服务产品。为广大普通网民提供了存储容量大、免费、安全、便携、稳定的跨平台文件存储、备份、传递和共享服务。360云盘是...
-
- 漫画全免费的看漫画软件下载
-
要是看动漫的话可以用迅雷看看或者PPTV,但是漫画的话4399小游戏里面就有漫画有漫画岛、漫画大全、爱漫画、腾讯动漫、大角虫、快看漫画、布卡漫画和微信读书。1、漫画岛:是一款适用于手机的热门漫画阅读软件。最全的二次元看漫画神器。分安卓版和...
-
2026-01-23 15:43 off999
- 服务器品牌前十大排名(国产服务器品牌前十大排名)
-
品牌排名企业1.Dell戴尔2.Hewlett-Packard惠普3.IBMIBM4.NetApp美国网比较安全系统5.Hitachi日立6.Or...
- mp3在线剪辑工具免费(mp3在线剪切软件下载)
-
风云音频处理大师风云音频处理大师是一款相当出色的专业化音频处理软件。小编使用比较多的也是风云音频处理大师,它的功能全面,能够帮助用户快速上手音频剪辑,还可以对音频的噪音进行降噪处理,对音频进行调速、拼...
- photoshop怎么抠图(ps怎么抠出想要的部分)
-
首先用ps打开要抠的图片,然后鼠标点击菜单栏:选择-色彩范围2,吸管吸取要抠的水,这里要慢慢调节,选择水的最佳位置。选取后,鼠标点击确定3,这时候抠水的部分就被选中,我们就按键盘上的ctrl+j复制,...
- 中国电信测速平台(中国电信测速平台有哪些)
-
山东省电信测速网站的网址是http://10000.sd.cn/。这个网站可以测试山东电信宽带的网速,方便用户了解自己的网络状况。下载电信的宽带助手就可以,给你个网址链接http://gd.189.c...
- 12306列车时刻表查询最新(下载火车时刻表查询最新时刻表)
-
、铁路12306app查询打开手机12306软件,进到首页后,点击下方“我的”,点击左上方头像位置,进入登录/注册页面后,登录12306账号,进到首页面后,点击下方的“订单”,点击“本人车票”,就能看...
- 宇宙战舰类游戏(宇宙战舰类游戏排行榜)
-
亚顿之矛,可以帮星灵度过最危难的时刻船内休眠着一整支圣堂武士部队,74千米的长度内安置着一颗人造(星灵制造)恒星。
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
linux软件(linux软件图标)
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
