1. 程式人生 > >將一個簡單的python程式打包成加密的docker映象並對外提供介面

將一個簡單的python程式打包成加密的docker映象並對外提供介面

環境: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值


開啟即為我們剛才的測試內容