在之前的一篇文章中:利用Docker來搭建分布式文件系統FastDfs,我們已經搭建好了FastDfs分布式文件系統,並且已經可以通過命令進行上傳操作,那么如何使用python來上傳文件呢?
很簡單,還是利用docker的特性,我們知道docker 的 -v 參數,可以自動掛載宿主機的文件件到容器中去,這樣宿主和容器就可以進行無障礙的文件共享,我們通過-v參數,把宿主機的root目錄自動掛載到docker容器中的/var/root目錄中去。
docker run -d --network=host --name tracker -v /root:/var/root delron/fastdfs tracker docker run -d --network=host --name storage -e TRACKER_SERVER=172.18.0.1:22122 -v /root:/var/root -e GROUP_NAME=group1 delron/fastdfs storage
我們又起了兩個服務,一個tracker(調度)另外一個是storage(倉庫),只不過都共享了宿主的文件夾/root,掛載到了/var/root下
然后分別進入宿主的命令行以及進入容器storage的命令行,發現文件夾已經共享
此時,我們可以利用docker的exec命令不進入容器,直接在宿主機的環境下調用容器內的命令,因為文件夾已經共享,所以我們輸入的文件目錄雖然是容器中的/var/root目錄,但是實際上該上傳的文件就在宿主的/root目錄中,這里,我們不上傳圖片,而是上傳一個視頻
docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4
上傳成功后,fastdfs將會返回視頻的網絡地址
這樣,在django中上傳文件時,就可以通過命令的方式上傳到fastdfs中,獲取返回地址后入庫就可以了,本次操作將docker的特性運用到了極致,由此可見docker的泛用性之廣,實實在在的提高了開發效率。
瀏覽器訪問一下,沒有問題
至此,在宿主機中上傳文件已經搞定,而python同樣也可以在命令行中執行命令,我們可以從命令中得到URL的做法來實現django與fastdfs的交流,這里利用的是python中的os.popen方法,可以非常簡單的在命令行中獲取返回的fastdfs網絡地址,從而避開了必須要安裝fastdfs的python客戶端,因為該客戶端對python3並不十分友好。代碼如下:
import os import re std = os.popen("docker exec -i storage /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /var/root/test.mp4").read() print('*********** fastdfs excute start ***********') print(std.strip()) print('*********** fastdfs excute end ***********')
這樣,在django中上傳文件時,就可以通過命令的方式上傳到fastdfs中,獲取返回地址后入庫就可以了,本次操作將docker的特性運用到了極致,由此可見docker的泛用性之廣,實實在在的提高了開發效率。