日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker_制作docker镜像

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Docker_制作docker镜像 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

聲明:文章為隨筆性質(zhì),無意侵權(quán)。若有冒犯,請文后留言,會盡快處理。

背景介紹

?? 硬件 RK3399pro盒子,系統(tǒng) RK3399pro盒子專用 Ubuntu 18.04,目的:制作docker 鏡像

心得體會

?? 一般情況,docker鏡像的制作過程為:在dockerfile 中配置好環(huán)境,然后執(zhí)行相應(yīng)的編譯和鏈接過程。這種方式的好處為,在一個地方編譯后,dockerfile 是可以通用的,但環(huán)境配置比較麻煩,但這種方式具有可復(fù)制性
?? 我是用的方式是,在本地完成編譯和鏈接過程,然后將編譯后的文件進行打包鏡像。這樣的方式,好處是不需要在鏡像中配置相應(yīng)的C++環(huán)境,只需要保證鏡像可以完成相應(yīng)的功能即可;但壞處是每次都需要重寫Dockerfile 文件即此方式不具有可復(fù)制性(編譯后,依賴庫的文件寫死了,需要在鏡像中構(gòu)建與本地相同的目錄結(jié)構(gòu))。但如果要追求鏡像小的話,應(yīng)該采取這種方式,因為不需要在鏡像中配置編譯環(huán)境

重點收獲

  • & 可以實現(xiàn)后臺方式運行驅(qū)動,例如:/usr/bin/npu_transfer_proxy & , 便實現(xiàn)了后臺方式在盒子中啟動 NPU 驅(qū)動。
  • -v 參數(shù)不僅可以映射本地設(shè)備到鏡像中(–v /dev/bus/usb:/dev/bus/usb –v /sys/kernel/debug/: /sys/kernel/debug/);還可以將本地中程序依賴庫環(huán)境映射到鏡像中,這樣便可以減小鏡像的容量。但這存在一個問題,需要在本地配置相應(yīng)的環(huán)境,與使用docker 的初衷是相違背的(使用docker的本意便是為了方便移植到不同物理機中使用,避免重復(fù)的配置環(huán)境工作)。而映射本地設(shè)備則與次情況不同,因為不將本地的npu 驅(qū)動映射進鏡像中,就不能夠在鏡像中使用 NPU。

為什么用docker

  • 為什么要用Docker?假設(shè)有這樣一個場景,你在你的ubuntu中編寫并編譯通過了的程序需要交付給測試人員測試,如何做?直接發(fā)可執(zhí)行文件?當然不行,這樣你的測試人員會問你為什么我運行報錯,你會說缺少一個某某庫,你編譯一下某某庫再運行吧,顯然,這是一種極其不合理的測試方式,換一臺電腦就要重新配置,將浪費大量的時間。或者你可以說把你的電腦拷貝給測試人員,這很傳統(tǒng)也很好地解決了這個問題,docker解決了“把你的電腦拷貝”這個問題。你可以利用docker制造一個與你的電腦環(huán)境相同的母本(image)并上傳到你的個人倉庫(dockerhub),測試人員只需要到倉庫pull你的image,并根據(jù)你的image創(chuàng)造一個一摸一樣的運行環(huán)境(container)即可解決問題。這與GitHub相似,因此上手非常容易。
  • 制造image:Dockerfile的書寫。想要制造與本地環(huán)境相同的image,必須利用Dockerfile來實現(xiàn),這類似于CmakeLists能很好地聲明預(yù)編譯組織結(jié)構(gòu)一樣,Dockerfile能很好地說明將要生成的Image中應(yīng)該包含什么,做什么。例如,我想要一個基于Ubuntu16.04的image,并且拷貝我本地的可執(zhí)行文件和庫文件以及其他數(shù)據(jù)或是配置文件。

Docker 常用命令

  • 查看鏡像列表:sudo docker image ls
  • 創(chuàng)建鏡像:sudo docker build -t 鏡像名:版本號 .
  • 運行鏡像:sudo docker run 鏡像名:版本號
  • 進入鏡像:sudo docker run -it --entrypoint bash 鏡像名:版本號
  • 向官網(wǎng)搜索可用鏡像:sudo docker search 鏡像名
  • 從官網(wǎng)下載鏡像: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 驅(qū)動無法安裝,情況如下:
??在RK3399pro盒子上制作docker鏡像,制作完成后,進入docker鏡像中運行自己程序,報錯“ E NPUTransfer : Cannot connect to proxy : Connection refused ”,自己查了下資料說是沒有NPU驅(qū)動。
??在RK3399社區(qū)中查到使用 “ apt-get update ” 和 “ apt-get install firefly-3399pronpu-driver ” 命令可以在盒子中完成NPU驅(qū)動的安裝。
??在鏡像中使用同樣的方法“ apt-get update ” 命令可以執(zhí)行成功,但在執(zhí)行后一條命令是報錯 “ E:Unable to locate package firefly-3399pronpu-driver ” 。
??報錯結(jié)果截圖如下:

圖:缺少 NPU 驅(qū)動報錯截圖

??2019年2月14日,有人就類似問題在社區(qū)中提出,鏈接:https://t.rock-chips.com/forum.php?mod=viewthread&action=printable&tid=105
??但實際情況與之有異(在已解決問題的情況下的回顧),已經(jīng)能夠成功解決該問題。

圖:缺少 NPU 驅(qū)動報錯截圖

制作docker 鏡像,具體實現(xiàn)過程如下

??首先,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"]

??參數(shù)解釋:

  • FROM 指定基礎(chǔ)鏡像;
  • WORKDOR 指定在鏡像中的工作目錄(即進入鏡像之后所在的路徑);
  • RUN 運行命令,在創(chuàng)建鏡像的時候執(zhí)行的命令,可以有多個,不同命令之間用 && 連接,不用換行。使用 && 方式,可以在一定程度上減小最終docker 鏡像的大小,實際應(yīng)用中使用 && 連接的命令不用換行。(不使用&&則分成多個RUN命令即可);
  • COPY 命令,從電腦中向鏡像中復(fù)制文件時會用到;
  • CMD 命令,使用 docker run 命令運行鏡像時自動執(zhí)行的命令。

創(chuàng)建鏡像: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
??參數(shù)解釋,如下:

  • -i : 交互式操作
  • -t : 開啟一個終端
  • –privileged :網(wǎng)上查到的解釋是,讓鏡像執(zhí)行時擁有root權(quán)限,但應(yīng)該不僅于此
  • -v :將宿主機目錄掛載到容器里,將本地的外部文件映射到鏡像中,保證了在鏡像中能夠正常啟用 NPU 驅(qū)動
  • aaa:1.0 : 其中 aaa 為鏡像名,1.0 為版本號,中間用 :進行連接
  • bash :個人理解,讓用戶能夠查看到終端交互信息的結(jié)果。

    ??運行結(jié)果如下圖所示,程序能夠自動執(zhí)行
圖:在盒子中使用docker run 方式運行docker 鏡像

進入鏡像的方式啟動

進入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,命令如下(最后單個&實現(xiàn)了后臺方式運行) :

  • /usr/bin/npu_transfer_proxy &

然后進入build 文件夾下,執(zhí)行 sh 命令:

  • cd ./build (注:Dockerfile 中WORKDIR 指定到了build 文件夾中,則不用再執(zhí)行此命令)
  • sh run_face.sh

運行結(jié)果如下圖所示,程序不能自動結(jié)束,進入鏡像后使用 CTRL + C的方式結(jié)束,在鏡像外只能關(guān)閉終端窗口。

圖:進入鏡像方式,運行程序

查看docker的垃圾鏡像位置并刪除

思路:du -h --max-depth=1 ,從根目錄開始,逐級查看每個子文件夾的大小;垃圾容器在 ./userdata 位置

  • docker system df , 查看docker 占用系統(tǒng)容量
    ??再次查看當前文件夾下子文件夾大小,
    ??看到垃圾容器所在位置為:./userdata/docker
  • sudo -s ,將當前用戶轉(zhuǎn)為root 用戶
  • cd ./docker ,進入docker 文件夾
    ??再次查看當前文件夾下子文件夾大小,
  • cd ./overlay2 ,進入文件夾
  • docker system df -v,查看當前系統(tǒng)中容器的使用情況
  • docker rm -f ‘ docker ps -aq ’ :刪除所有容器(其中 ` 是~ 下面的符號)
    ??docker ps -aq:列出所有容器id (-a 列出所有容器,-q靜默模式只顯示id)
    ??再次使用 df -h 命令查看,可以看到空間充足

查找 firefly-3399pronpu-driver 驅(qū)動的安裝包

  • rm -rf /var/cache/apt/archives/* : 在盒子中將 該目錄下的所有文件刪除,以保證之后在該文件夾下可以看到NPU驅(qū)動的依賴包

  • sudo apt install --reinstall -d firefly-3399pronpu-driver :然后看看/var/cache/apt/archives/下有沒有東西

  • ??--> 出現(xiàn)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 后面有空格,` 在~ 下

  • ??--> 命令執(zhí)行成功,但/var/cache/apt/archives/ 下的文件數(shù)量沒有增加

  • apt-cache depends firefly-3399pronpu-driver : 查看該軟件的依賴,不能在root 下(sudo -s 方式進入 root )

查看安裝包的依賴

  • 找到了npu驅(qū)動的安裝包: firefly-3399pronpu-driver_1.6.0_arm64.deb
  • 使用命令:dpkg –L firefly-3399pronpu-driver (包名),可以查看包中有哪些東西。
  • 執(zhí)行里面的 /usr/bin/npu_transfer_proxy 在盒子中可以看到:Transfer version 2.0.0 、devid 、pid 等信息。
  • 執(zhí)行命令: /usr/bin/npu_transfer_proxy & ,可以實現(xiàn)以后臺方式啟用NPU驅(qū)動

npu 驅(qū)動需要的文件之一

npu_transfer_proxy 文件是npu 驅(qū)動需要的文件,在 /usr/bin/npu_transfer_proxy 中

npu 設(shè)備文件在 /dev 目錄下

/dev

查看盒子的硬件信息

lscpu

類似優(yōu)質(zhì)文章鏈接

史上較全docker鏡像制作流程(有基礎(chǔ)鏡像,非docker build): CSDN 鏈接

總結(jié)

以上是生活随笔為你收集整理的Docker_制作docker镜像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。