Docker 使用雜記 – 最佳實踐嘗試 – 實戰

  • 2020 年 3 月 15 日
  • 筆記

Docker 使用雜記 – 最佳實踐嘗試 – 實戰

本文記錄了一個項目中使用docker構建環境的過程

Docker簡介

Docker NB!好了 其他簡介自己看網上吧

項目背景

內在原因

這次的程式碼基於一個特定的tensorflow版本構建(才不是tf2跑不起來呢!

外在原因

與別人分享程式碼的時候就可以不用告訴他怎麼一步步配置環境了

並且基於GPU的Docker鏡像可以由nvidia-docker直接運行

基礎鏡像

FROM

需求

Tensorflow==1.14

CUDA==10.0

cuDNN==7.4

openCV==3.4.2.16

俗話說好的開始是成功的一半

這次的基礎鏡像就由tensorflow官方搭的鏡像為基礎

看了一圈選擇了tensorflow/tensorflow:1.14.0-gpu-py3

地址在這tensorflow:1.14.0-gpu-py3

挺不錯 自帶GPU支援 要構建其他鏡像的同學也可以在tags裡面搜索即可 全都有

鏡像維護者

LABEL

這裡是說的MAINTAINER這個標籤 但是我剛敲出來 就發現 過期了(deprecated

上網一搜發現解決方案是用LABEL

最佳實踐:

LABEL maintainer="Licsber <[email protected]>"

工作文件夾

WORKDIR

顧名思義 制定容器內默認的文件夾

不指定的話默認就是/根目錄

WORKDIR /home

文件

ADD

ADD的好處是tar.gz文件可以自動解壓

並且ADD可以從網路路徑拷貝文件

任何情況下盡量不使用ADD(因為各種奇怪行為

COPY

顧名思義 COPY:拷貝文件

語義明確 推薦使用

注意目標地址一定要是一個目錄(不然報錯

源地址拷貝會自動相當於有一個/*的拷貝

於是乎造成的特性就是只拷貝文件夾內的內容

COPY sources.list /etc/apt/    COPY model /home/model/    COPY *.py /home/

另外的特性就是可以使用通配符(符合Go語法即可(GoNB

宗卷

VOLUME

設置宗卷之後可以使用外置環境的內容了

VOLUME /data

掛載的方式:在docker run後面帶上參數

-v $源路徑:$宗卷名稱切記別反了(我第一次就反了 debug半天

例如:

sudo docker run -v /Users/licsber/Download:/data $項目名稱

這樣在鏡像內/data就能訪問到外置環境了 方便保存結果 讀取文件

命令

RUN

RUN用於運行命令

最佳實踐:

RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y &&       pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip &&       pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple 

新手會把RUN命令寫多個 但是每一個Docker命令都會新建一層

這樣會讓層數特別多 於是 如果只是為了構建環境 一句話就夠

入口點

ENTRYPORT

CMD命令差不多

區別就是不會被默認替換

如果只定義CMD 空參數運行默認執行CMD里的內容

如果只定義CMD 帶參數運行會覆蓋CMD定義的命令

ENTRYPOINT ["python", "main.py"]

這樣鏡像名:tag後面的參數就會默認追加到入口點了

CMD

另外需要注意的就是Docker沒有後台的概念

如果在裡面寫這樣:

CMD service nginx start

會發現容器秒退 因為Docker是容器 具體解釋參見CMD容器啟動命令

Dockerfile

okk 看完了前面 終於到了重點

把這些命令一行行碼好 放到一個Dockerfile

就可以build

build之後 run push 之類的操作豈不是順手拈來

另外可以看看阿里天池的Docker訓練 也能摸索tag的使用方法

還有關於tag的一個小坑 latest 這個自己Google吧

完整的Dockerfile貼在這:

FROM tensorflow/tensorflow:1.14.0-gpu-py3    LABEL maintainer="Licsber <[email protected]>"    WORKDIR /home  VOLUME /data    COPY sources.list /etc/apt/    RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y &&       pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip &&       pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple    COPY model /home/model/    COPY *.py /home/    ENTRYPOINT ["python", "Retargeting.py"]

後記

話說loop: 改程式碼 -> build同一個tag -> 運行是不是最佳實踐呀?

實測產生大量<none> 需要手動刪除

這裡貼出來一鍵程式碼:清理無用的docker鏡像

alias dclean='sudo docker rmi $(docker images -f "dangling=true" -q)'

沒錯 我就是電腦里定義了100+alias的小天才(逃

本文環境

Docker engine==19.03.5

參考

Docker — 從入門到實踐

Docker MAINTAINER Instruction