tutorials
docker
ubuntu
linux
cuda
GPU
NVIDIA
python
deep learning
AI
Dockerfile
其實就像是用很多 linux 指令的組合來構建想要的系統 image
,一般我們都會用 DockerHub 上現存的 image
在網上建構,最常用的官方 image
有 ubuntu,還有近年因機器學習而竄起的 nvidia cuda
詳細指令內容請看官方教學,接下來只會大概介紹 FROM
、ARG
、WORKDIR
、RUN
接下來用以下我寫的 nvidia cuda Dockerfile 講解
以下文件結尾的 \
是表示換行接續符
21
行、23
行及 24
行都是 ARG
變數,這種變數是只會存在於 Dockerfile
中,並不會留到之後的 image
或是 container
中,並且可以在使用 Dockerfile
建立 image
時使用而外的 --build-arg {ARG_param_name}={ARG_value}
來改變 ARG
變數的值
也就是 CUDA
變數預設為 10.0-cudnn7-runtime-ubuntu18.04
,而 PYTHON_VERSION
變數預設為 3
,可以在建立image
時加上 --build-arg CUDA=9.0-cudnn7-runtime-ubuntu16.04
、--build-arg PYTHON_VERSION=3.8
來將預設值改變
更多建立
image
的教學請看這裡
runtime
版本是輕量版的 nvidia-cuda image,如果要更完整版請使用 devel
版本
例如
10.0-cudnn7-
devel
-ubuntu18.04
docker
基本上就像是疊積木,簡單來說 FROM
就是決定你要從哪個 base image
開始疊起,而這裡是使用 nvidia/cuda
repository 下的 $CUDA
tag 的 image
,而這裡的 $CUDA
指的是上面 ARG
變數的 CUDA
值(預設為10.0-cudnn7-runtime-ubuntu18.04
)
依照預設值展開,這行就等價於 FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04
WORKDIR
是拿來設定 RUN
, CMD
, ENTRYPOINT
, COPY
和 ADD
指令的相對路徑,也是預設進入的路徑,若是不存在該路徑則會自動建立
RUN
就是執行某個 shell
指令
29 ~ 31
行-y
: 安裝時預設 yes
,不用詢問34 ~ 42
行-y
: 安裝時預設 yes
,不用詢問51 ~ 58
行這段是比較有條件的指令
39
行ubuntu
版本,因為 CUDA
參數是在 FROM
之前,所以在之後會無法得知該參數的數值,因而要另外確認ubuntu=$(lsb_release -r | grep "Release:")
: 首先使用 lsb_release -r
列出系統版本資訊,接著使用 grep
找出 Release:
部分(也就是釋出版本)ubuntu=${ubuntu##*:}
: 將剛剛那行只取 :
之後的部分(版本號部分)
lsb_release -r
輸出為而使用
grep "Release:"
後得到的值為Release:18.04
使用ubuntu=${ubuntu##*:}
會將其值只保留最後的18.04
52
行$PYTHON_VERSION
不是 2.7
和 3
才需要進條件(預設不需要進此條件)53 ~ 55
行python
版本才需要進條件(預設不需要進此條件)(ubuntu16.04
且不是 python3.5
) 或 (ubuntu18.04
且不是 python3.6
) 或 (ubuntu20.04
且不是 python3.8
)
56 ~ 57
行55
行表示如果沒有要使用系統預設的 python
版本,則需要添加第三方套件(所以需要安裝 41
行的 software-properties-common
套件)57
行則是在剛剛添加完第三方套件後要執行更新讓系統知道有新的套件可安裝61 ~ 65
行61 ~ 63
行都是安裝設定的 python
版本65
行則是把預設的 python
指令軟連結設為剛剛安裝的指定 pyhton
版本79
行sed
修改色彩控制的 PS1
參數
是修改 PS1
在 ~/.bashrc
檔案出現的第 2 次
PS1
\u
: user name,使用者名稱\h
: host name,電腦名稱\w
: work path,當前工作路徑簡單來說就是
@
之前加入 \[\033[01;37m\]
\h
之前加入 \[\033[01;35m\]
79
行取消註解68 ~ 74
行python3-distutils-extra
: 安裝 distutils
避免一些 python
安裝錯誤ln -sf /usr/bin/python$PYTHON_VERSION /usr/bin/python3
: 將 python3
軟連結設定為指定的 python3
版本72 ~ 74
行: 安裝 pip
82 ~ 87
行82
行: 將 ~/.bashrc
中的 #force_color_prompt=yes
取代為 force_color_prompt=yes
來打開 container
的 bash
提示色85
行: 設定新指令 nv
,該指令等價於後面的 nvidia-smi
指令86
行: 設定新指令 wnv
,該指令等價於後面的 watch -n 1 nvidia-smi
指令,也就是每 1
秒執行並刷新 nv
指令87
行: 設定新指令 wwnv
,該指令等價於後面的 watch -n 0.1 nvidia-smi
指令,也就是每 0.1
秒執行並刷新 nv
指令alias
要寫在 ~/.bash_aliases
檔案內