将一个简单的python程序打包成加密的docker镜像并对外提供接口
环境:python2.7 docker:一、一个简单的python程序既然是一个简单的python程序,那我们就实现一个简单的加法功能即可。#coding=utf-8import randomdef add(aStr,bStr): map={} try: a=float(aStr) b=float(bStr) sum=a+...
环境:python2.7
docker:
一、一个简单的python程序
既然是一个简单的python程序,那我们就实现一个简单的加法功能即可。
#coding=utf-8
import random
def add(aStr,bStr):
map={}
try:
a=float(aStr)
b=float(bStr)
sum=a+b
file_name=str(int(random.random()*1000000))+""
file=open("data/"+file_name+'.txt',"w")
file.write(str(a)+"+"+str(b)+"="+str(sum))
file.close()
map["result"]="OK"
map["id"]=str(file_name)
except:
map["result"]="wrong"
return map
if __name__=="__main__":
print "运行run啊大哥,不是这个"
map=add("4.5",5.6)
print map
这个方法实现的功能都能看明白,就是把a和b相加,并且将结果输出在一个文件中,并返回是否运行成功,如果成功则再加上文件的编号(后面那段不管= =)
二、对外提供一个调用接口
除了这段代码我们还需要对外提供一个调用接口,我使用tornado开一个web服务来提供接口,这个方法命名为run方法= =
#coding=utf-8
import tornado.web
import tornado.ioloop
from add import add
#定义处理类
class Add(tornado.web.RequestHandler):
#添加一个post请求方式的方法
def post(self):
#向响应中,添加数据
a=self.get_argument('a', '')
b=self.get_argument('b', '')
map=add(a,b)
self.write(map)
def make_app():
return tornado.web.Application(
[(r'/add', Add)],
)
if __name__ == '__main__':
# 创建一个应用对象
app = make_app()
#绑定一个监听端口
app.listen(8888)
#启动web程序,开始监听端口的连接
tornado.ioloop.IOLoop.current().start()
当我们运行run.py之后,在终端输入命令 curl -d 'a=3&b=9' 'localhost:8888/add'
终端返回信息为:{"result": "OK", "id": "808992"} (这里的ID不一定会相同,只是一个随机数)
在到同文件下面的data目录即可找到对应的数据文件
到此,我们已经实现了一个python的简单程序,并使其对外提供了一个接口调用,现在我们要将其打包到docker镜像中并对关键代码(add)进行加密
三、运行一个ubuntu镜像,对安装好python,vim等以及必要的python包例如tornado(docker 的安装使用就不多说了= =)
显然我们需要的是第一个镜像,将其pull到本地,即运行docker pull ubuntu
查看本地镜像docker images 可以看到刚才的镜像
启动它!并安装一些必要的东西!
docker run -it c9d990395902 /bin/bash 其中c9d990395902为ubuntu的镜像ID,如果你pull的时候它已经更新过了ID可能产生变化,/bin/bash是使得进入新运行的容器内部
首先执行apt update更新ubuntu系统
然后使用apt install python安装python2
中途会问你有一步是否继续,输入y并回车即可
输入python能进入如下页面即安装成功,输入exit()回车退出编辑
使用apt-get install python-pip python-dev build-essential安装pip,注意同样需要y回车
安装完成后输入pip -V即可查看是否安装成功
安装vim,命令是apt-get install vim
导入一些python的包,比如tornado,使用命令pip install tornado
再比如cython,命令为pip install cython
至此,我们给这个容器安装完成了python,pip,vim以及导入了两个必要的包
四、新建文件夹并且把代码复制到容器中
在根目录运行mkdir add_uncleyiba,新建文件夹add_uncleyiba
进入add_uncleyiba文件夹,新建目录data,新建文件test.py
用vim打开test.py
随便按个键比如a,进入编辑模式,输入print 123,然后按Esc,输入:wq(前面是冒号),然后回车,即为保存
运行python test.py,测试一下没有问题
现在新建三个文件,分别叫add.py,run.py,setup.py
利用vim打开add.py把之前的代码复制进去,同理复制run.py的代码(注意,先进入编辑模式之后再复制)
复制并保存之后可以利用cat命令查看代码是否有问题
cat add.py
我们可以尝试在容器中运行add.py,使用命令python add.py
看上去也没有问题
现在vim打开setup.py文件,并输入以下内容
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["add.py"]))
然后保存退出
运行命令python setup.py build_ext,目的是为了生成add.py文件的so文件,保证源码安全
我们可以发现新生成了build文件夹
如图add.so即我们需要的so文件!
使用mv add.so ../../add.so将它放到外层的文件夹去
现在我们可以删除一些没有用的东西了,除了add.so,data,run.py,setup.py,其他的都可以删除了
友情提示:删除命令小心使用= =动图想必都看过了
图片好像动不起来- -可以去一些水群里面找图。。。
五、提交镜像,并运行测试
重新打开一个终端,然后将该容器制作成一个镜像docker commit 248224b7067e add_uncleyiba:1.0
id 是查看自己的容器id得到的,后面的是你要生成的镜像名字+冒号+版本号
之后我们查看本地镜像的时候就会发现成圣了add_uncleyiba:1.0这个镜像了
回到一个任意目录,当然,最好是你之前保存python代码的目录,新建文件夹名字叫data
然后运行命令
docker run -itd -p 8899:8888 -v #{local_abs_path}:/add_uncleyiba/data add_uncleyiba:1.0 python /add_uncleyiba/run.py
其中#{local_abs_path}改成data文件夹的本地的绝对路径(cd进目录后使用pwd查看)
出现新的容器ID后使用curl -d 'a=5&b=7' 'localhost:8888/add'进行访问测试就好了~
这时候我们可以进入到本地的data文件夹,会发现里面有一个文件名就是刚才返回的id值
打开即为我们刚才的测试内容
更多推荐
所有评论(0)