背景:
實驗室可以使用一個浪潮的AI計算平台,該平台運行的都是docker容器,並且不能聯網,因此誰要是想要安裝什么軟件的話就需要自己單獨打包鏡像到平台上,大致步驟為:
1. 在平台的鏡像管理中找到自己想要用的基礎鏡像,將其從雲主機的docker鏡像庫中導出到雲主機硬盤中
2. 將雲硬盤中的鏡像通過sftp下載到本地電腦上(Ubuntu18.04, 已安裝docker)
3. 將下載到本地硬盤上的鏡像導入到本地主機的docker庫中
4. 將導入到本地主機docker庫中的鏡像啟動為容器,並安裝你所需要的軟件
5. 將安裝好軟件的容器保存為新的鏡像
6. 將保存好的新的鏡像從本地docker庫中導出到本地硬盤
7. 把新的鏡像從本地硬盤通過sftp上傳到雲主機硬盤
8. 將保存在雲主機硬盤上的新的鏡像導入到雲主機docker庫中
9. 將雲主機中docker庫中新導入的鏡像啟動為容器
經過上述步驟,成功完成浪潮AI計算平台的docker容器內運行軟件的更新。
不過上述方法教給實驗室的師弟后,可謂是叫苦連天,太過於復雜的麻煩的更新步驟,難以推廣開。
於是乎,我想到了一個新的解決方法, 如果我們不把docker鏡像打包,而是直接把所用的軟件打包,直接上傳可不可以呢。因為實驗室里的大家都是使用python及其第三方框架,沒有太多的系統依賴,docker鏡像之所以好用就是因為它可以很好的打包系統依賴,但是我們不需要系統依賴的軟件是不是docker鏡像的這種打包方式也顯得笨重了呢。這就和你在A同學的windows10電腦上安裝了個QQ,你想在B同學電腦上也安裝個QQ,虛擬機的解決方法是直接把A同學電腦的系統打包成鏡像然后安裝到B同學電腦上,docker的解決方法是直接把QQ軟件相關的依賴和QQ軟件自身打包做成鏡像然后再安裝到B同學電腦上,但是如果QQ這個軟件本身就不依賴系統組件或環境呢,換句話說如果QQ所依賴的系統環境是最基本的,只要是windows10系統都會滿足這種依賴的情況下我們如何做呢?我們只需要把安裝好的QQ程序(從exe中解壓出的程序庫等)直接copy到B同學電腦上,然后直接在B同學電腦上運行不就解決了嘛,這樣花費較小的代價也是可以解決問題的。其實更簡單的,或是大家實際的做法就是把A同學電腦上QQ安裝程序(那個EXE文件)直接拷貝到B同學電腦上,然后安裝運行。
由於AI計算平台同樣是這個情況,我們所需要的python第三方包不能聯網通過pip或aconda安裝,但是這些python庫根本就不依賴系統環境,那么我們直接把所要用的第三方包,包括不同版本的python打包,然后上傳到容器中就可以了,完全不用上面那種花9個步驟來回導入導出docker鏡像的方法。
------------------------------------------------------------
給出具體的操作:
(所有計算平台上的docker容器都掛載一個雲主機目錄,我的賬號下面給的掛載目錄為 /testsoft01 )
(以下操作都是在root權限下的)
0. 首先在/testsoft01 目錄下安裝 anaconda
1. 在掛載的目錄下創建home目錄
mkdir /testsoft01/home
2. 將docker容器掛載的目錄更改權限
文件所屬者可以rwx, 同組的rw, other也是rw權限。
chmod -R 755 /testsoft01/
3. 創建用戶組名
addgroup wisdom
4. 創建用戶 devil , 並指定用戶組 wisdom, 指定主目錄 /home/devil , 給出shell執行路徑 /bin/bash
useradd -d /home/devil -s /bin/bash -m devil -g wisdom
5. 由於/home路徑為容器的路徑,如果銷毀容器則就是該目錄,因此將/home下的目錄轉移到掛載目錄下
mv /home/devil/ /testsoft01/home/
6. 將devil用戶的home目錄移到掛載目錄中后,為其創建軟鏈接,目標目錄設回原用戶目錄
ln -s /testsoft01/home/devil/ /home/devil
7. 為新創建的用戶devil設置密碼
passwd devil
(#刪除創建的用戶(如果創建錯了用這個刪) userdel -r devil )
8. 為新建的用戶devil 配置aconda環境
# >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/testsoft01/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then . "/testsoft01/anaconda3/etc/profile.d/conda.sh" else export PATH="/testsoft01/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< . /etc/aistationbc cd /home/devil
結束配置, 配置成功。以上操作后,新創建的用戶可以通過在 /testsoft01/anaconda3/envs 下面加入自己打包的環境,就可以正常運行了。(當然這個需要root權限,因為anaconda3文件加設置root可寫,這樣也防備用戶胡亂更改或添加python環境)
-----------------------------------------------------------------
打包
可以看到 anaconda環境下面有個tf-14.0的環境, 我們先要把它打包,命令:
tar -cvf /tmp/x.tar ./tf-14.0/
或者:
tar -cvf /tmp/x2.tar anaconda3/envs/tf-14.0/
其中,
tar -cvf /tmp/x.tar ./tf-14.0/
命令打包后解壓出來的直接就是 ./tf-14.0
tar -cvf /tmp/x2.tar anaconda3/envs/tf-14.0/
命令打包后解壓出來的直接就是 anaconda3/envs/tf-14.0/
解壓
tar -xvf x.tar
x.tar 解壓出來直接是 tf-14.0
而:
tar -xvf x2.tar
x2.tar 解壓出來是 anaconda3/envs/tf-14.0 :
----------------------------------------------
chmod -R 755 /testsoft01/ addgroup wisdom useradd -d /home/devil -s /bin/bash -m devil -g wisdom mv /home/devil/ /testsoft01/home/ ln -s /testsoft01/home/devil/ /home/devil passwd devil #刪除創建的用戶(如果創建錯了用這個刪) userdel -r devil # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/testsoft01/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "$__conda_setup" else if [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then . "/testsoft01/anaconda3/etc/profile.d/conda.sh" else export PATH="/testsoft01/anaconda3/bin:$PATH" fi fi unset __conda_setup # <<< conda initialize <<< . /etc/aistationbc cd /home/devil