Docker_制作docker镜像
聲明:文章為隨筆性質,無意侵權。若有冒犯,請文后留言,會盡快處理。
背景介紹
?? 硬件 RK3399pro盒子,系統 RK3399pro盒子專用 Ubuntu 18.04,目的:制作docker 鏡像。
心得體會
?? 一般情況,docker鏡像的制作過程為:在dockerfile 中配置好環境,然后執行相應的編譯和鏈接過程。這種方式的好處為,在一個地方編譯后,dockerfile 是可以通用的,但環境配置比較麻煩,但這種方式具有可復制性。
?? 我是用的方式是,在本地完成編譯和鏈接過程,然后將編譯后的文件進行打包鏡像。這樣的方式,好處是不需要在鏡像中配置相應的C++環境,只需要保證鏡像可以完成相應的功能即可;但壞處是每次都需要重寫Dockerfile 文件即此方式不具有可復制性(編譯后,依賴庫的文件寫死了,需要在鏡像中構建與本地相同的目錄結構)。但如果要追求鏡像小的話,應該采取這種方式,因為不需要在鏡像中配置編譯環境。
重點收獲
- & 可以實現后臺方式運行驅動,例如:/usr/bin/npu_transfer_proxy & , 便實現了后臺方式在盒子中啟動 NPU 驅動。
- -v 參數不僅可以映射本地設備到鏡像中(–v /dev/bus/usb:/dev/bus/usb –v /sys/kernel/debug/: /sys/kernel/debug/);還可以將本地中程序依賴庫環境映射到鏡像中,這樣便可以減小鏡像的容量。但這存在一個問題,需要在本地配置相應的環境,與使用docker 的初衷是相違背的(使用docker的本意便是為了方便移植到不同物理機中使用,避免重復的配置環境工作)。而映射本地設備則與次情況不同,因為不將本地的npu 驅動映射進鏡像中,就不能夠在鏡像中使用 NPU。
為什么用docker
- 為什么要用Docker?假設有這樣一個場景,你在你的ubuntu中編寫并編譯通過了的程序需要交付給測試人員測試,如何做?直接發可執行文件?當然不行,這樣你的測試人員會問你為什么我運行報錯,你會說缺少一個某某庫,你編譯一下某某庫再運行吧,顯然,這是一種極其不合理的測試方式,換一臺電腦就要重新配置,將浪費大量的時間。或者你可以說把你的電腦拷貝給測試人員,這很傳統也很好地解決了這個問題,docker解決了“把你的電腦拷貝”這個問題。你可以利用docker制造一個與你的電腦環境相同的母本(image)并上傳到你的個人倉庫(dockerhub),測試人員只需要到倉庫pull你的image,并根據你的image創造一個一摸一樣的運行環境(container)即可解決問題。這與GitHub相似,因此上手非常容易。
- 制造image:Dockerfile的書寫。想要制造與本地環境相同的image,必須利用Dockerfile來實現,這類似于CmakeLists能很好地聲明預編譯組織結構一樣,Dockerfile能很好地說明將要生成的Image中應該包含什么,做什么。例如,我想要一個基于Ubuntu16.04的image,并且拷貝我本地的可執行文件和庫文件以及其他數據或是配置文件。
Docker 常用命令
- 查看鏡像列表:sudo docker image ls
- 創建鏡像:sudo docker build -t 鏡像名:版本號 .
- 運行鏡像:sudo docker run 鏡像名:版本號
- 進入鏡像:sudo docker run -it --entrypoint bash 鏡像名:版本號
- 向官網搜索可用鏡像:sudo docker search 鏡像名
- 從官網下載鏡像:sudo docker pull 鏡像名
- 壓縮方式存儲鏡像:sudo docker save 鏡像名字:tag | gzip > 名字.tar.gz
- 非壓縮方式存儲鏡像:sudo docker save 鏡像名字:tag > 名字.tar.gz
- 加載鏡像:sudo docker load -i 名字.tar.gz
- 刪除鏡像: sudo docker rmi -f 鏡像名稱或ID
- 刪除垃圾容器:docker rm -f ‘ docker ps -aq ’ (其中 ’ 為鍵盤左上角 ~ 下面的符號)
問題記錄(已解決)
??報錯npu 驅動無法安裝,情況如下:
??在RK3399pro盒子上制作docker鏡像,制作完成后,進入docker鏡像中運行自己程序,報錯“ E NPUTransfer : Cannot connect to proxy : Connection refused ”,自己查了下資料說是沒有NPU驅動。
??在RK3399社區中查到使用 “ apt-get update ” 和 “ apt-get install firefly-3399pronpu-driver ” 命令可以在盒子中完成NPU驅動的安裝。
??在鏡像中使用同樣的方法“ apt-get update ” 命令可以執行成功,但在執行后一條命令是報錯 “ E:Unable to locate package firefly-3399pronpu-driver ” 。
??報錯結果截圖如下:
??2019年2月14日,有人就類似問題在社區中提出,鏈接:https://t.rock-chips.com/forum.php?mod=viewthread&action=printable&tid=105
??但實際情況與之有異(在已解決問題的情況下的回顧),已經能夠成功解決該問題。
制作docker 鏡像,具體實現過程如下
??首先,Dockerfile 如下圖
FROM ubuntu:18.04 WORKDIR /home/firefly/liangx/face_release_deque3/buildRUN mkdir -p /home/firefly/liangx/face_release_deque3 && apt update && apt install -y systemdCOPY ./temp/firefly-3399pronpu-driver_1.6.0_arm64.deb /home/firefly/liangx/face_release_deque3COPY ./3rdparty /home/firefly/liangx/face_release_deque3/3rdparty COPY ./CMakeLists.txt /home/firefly/liangx/face_release_deque3/CMakeLists.txt COPY ./Dockerfile /home/firefly/liangx/face_release_deque3/Dockerfile COPY ./build /home/firefly/liangx/face_release_deque3/build COPY ./include /home/firefly/liangx/face_release_deque3/include COPY ./models /home/firefly/liangx/face_release_deque3/models COPY ./rknn_api /home/firefly/liangx/face_release_deque3/rknn_api COPY ./src /home/firefly/liangx/face_release_deque3/srcCOPY ./temp/aarch64-linux-gnu /usr/lib COPY ./temp/npu_transfer_proxy /usr/bin COPY ./temp/libbsd.so.0 /lib/aarch64-linux-gnu COPY ./temp/libkeyutils.so.1 /lib/aarch64-linux-gnuRUN dpkg -i /home/firefly/liangx/face_release_deque3/firefly-3399pronpu-driver_1.6.0_arm64.deb && rm -rf /home/firefly/liangx/face_release_deque3/firefly-3399pronpu-driver_1.6.0_arm64.deb && rm -rf /var/cache/apt/* CMD ["sh","run_face.sh"]??參數解釋:
- FROM 指定基礎鏡像;
- WORKDOR 指定在鏡像中的工作目錄(即進入鏡像之后所在的路徑);
- RUN 運行命令,在創建鏡像的時候執行的命令,可以有多個,不同命令之間用 && 連接,不用換行。使用 && 方式,可以在一定程度上減小最終docker 鏡像的大小,實際應用中使用 && 連接的命令不用換行。(不使用&&則分成多個RUN命令即可);
- COPY 命令,從電腦中向鏡像中復制文件時會用到;
- CMD 命令,使用 docker run 命令運行鏡像時自動執行的命令。
創建鏡像:sudo docker build –t 鏡像名:版本號
運行鏡像:sudo docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb -v /sys/kernel/debug/:/sys/kernel/debug/ aaa:1.0 bash
??參數解釋,如下:
- -i : 交互式操作
- -t : 開啟一個終端
- –privileged :網上查到的解釋是,讓鏡像執行時擁有root權限,但應該不僅于此
- -v :將宿主機目錄掛載到容器里,將本地的外部文件映射到鏡像中,保證了在鏡像中能夠正常啟用 NPU 驅動
- aaa:1.0 : 其中 aaa 為鏡像名,1.0 為版本號,中間用 :進行連接
- bash :個人理解,讓用戶能夠查看到終端交互信息的結果。
??運行結果如下圖所示,程序能夠自動執行
進入鏡像的方式啟動
進入docker 鏡像命令:
- Sudo docker run –it --privileged –v /dev/bus/usb:/dev/bus/usb –v /sys/kernel/debug/: /sys/kernel/debug/ aaa:5.0 bash
進入鏡像之后,以后臺方式運行 /usr/bin/npu_transfer_proxy,命令如下(最后單個&實現了后臺方式運行) :
- /usr/bin/npu_transfer_proxy &
然后進入build 文件夾下,執行 sh 命令:
- cd ./build (注:Dockerfile 中WORKDIR 指定到了build 文件夾中,則不用再執行此命令)
- sh run_face.sh
運行結果如下圖所示,程序不能自動結束,進入鏡像后使用 CTRL + C的方式結束,在鏡像外只能關閉終端窗口。
圖:進入鏡像方式,運行程序查看docker的垃圾鏡像位置并刪除
思路:du -h --max-depth=1 ,從根目錄開始,逐級查看每個子文件夾的大小;垃圾容器在 ./userdata 位置
- docker system df , 查看docker 占用系統容量
??再次查看當前文件夾下子文件夾大小,
??看到垃圾容器所在位置為:./userdata/docker - sudo -s ,將當前用戶轉為root 用戶
- cd ./docker ,進入docker 文件夾
??再次查看當前文件夾下子文件夾大小, - cd ./overlay2 ,進入文件夾
- docker system df -v,查看當前系統中容器的使用情況
- docker rm -f ‘ docker ps -aq ’ :刪除所有容器(其中 ` 是~ 下面的符號)
??docker ps -aq:列出所有容器id (-a 列出所有容器,-q靜默模式只顯示id)
??再次使用 df -h 命令查看,可以看到空間充足
查找 firefly-3399pronpu-driver 驅動的安裝包
-
rm -rf /var/cache/apt/archives/* : 在盒子中將 該目錄下的所有文件刪除,以保證之后在該文件夾下可以看到NPU驅動的依賴包
-
sudo apt install --reinstall -d firefly-3399pronpu-driver :然后看看/var/cache/apt/archives/下有沒有東西
-
??--> 出現firefly-3399pronpu-driver_1.6.0_arm64.deb 安裝包( 37M ),在/var/cache/apt/archives/ 目錄下
-
sudo apt install --reinstall -d ‘ apt-cache depends firefly-3399pronpu-driver|grep Depends |cut -d: -f2 |tr -d “<>” ’:-d 后面有空格,` 在~ 下
-
??--> 命令執行成功,但/var/cache/apt/archives/ 下的文件數量沒有增加
-
apt-cache depends firefly-3399pronpu-driver : 查看該軟件的依賴,不能在root 下(sudo -s 方式進入 root )
查看安裝包的依賴
- 找到了npu驅動的安裝包: firefly-3399pronpu-driver_1.6.0_arm64.deb
- 使用命令:dpkg –L firefly-3399pronpu-driver (包名),可以查看包中有哪些東西。
- 執行里面的 /usr/bin/npu_transfer_proxy 在盒子中可以看到:Transfer version 2.0.0 、devid 、pid 等信息。
- 執行命令: /usr/bin/npu_transfer_proxy & ,可以實現以后臺方式啟用NPU驅動
npu 驅動需要的文件之一
npu_transfer_proxy 文件是npu 驅動需要的文件,在 /usr/bin/npu_transfer_proxy 中
npu 設備文件在 /dev 目錄下
/dev
查看盒子的硬件信息
lscpu
類似優質文章鏈接
史上較全docker鏡像制作流程(有基礎鏡像,非docker build): CSDN 鏈接
總結
以上是生活随笔為你收集整理的Docker_制作docker镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机网站——自适应
- 下一篇: LABLEME UPDATE DAMO