前言
dockerfile 算是用來「文件」式的管理環境最好用的方法,
當然我自己之前也用過 docker image 來管理環境過,
但畢竟一個是「文字檔」,一個是「image」自然檔案大小也差了 N 倍,
這次把握了一點時間來學習並整理一下 dockerfile 該怎麼寫!
以下依照「常見的撰寫 dockerfile 順序排列」
變數介紹
FROM
通常寫在最開頭,如果不想完全從 0 開始建立,
可以透過 FROM 表示要從哪一個已經有的 image,去疊加自己的東西
FROM ubuntu:20.04
ARGS
用來設定一些變數,經常與 ENV 搭配使用
ARGS MY_PATH="/mypath/"
ENV
設定環境變數,也就是說,當 container 經由 dockerfile 建立的時候,
會一開始就設定好的環境變數。
搭配 ARGS 使用可能會長這樣
注意與 ARGS 差別就是在,「ARGS 沒有設定環境變數,只有設定變數而已」
ARGS MY_PATH="/mypath/"
ENV MY_HOME="${MY_PATH}"
RUN
建立 container 階段就執行的指令
常見的安裝
RUN apt-get update -y
RUN apt-get upgrade -y
或例如我一開始就想安裝 python3 的 numpy package
RUN pip3 install numpy
COPY
因為 container 內部的檔案可能與外面的 Host (也就是你本身的電腦)獨立,
我們可以在建立階段就從外部 copy 一份資料進來,
這樣就不怕 container 內拿不到外面的檔案
如果不懂概念的話,可以想像 container 是電腦中的電腦,但兩者資料存放的位置沒辦法互相溝通。
COPY <外部路徑> <目標 continer 內的檔案路徑>
CMD
RUN 跟 CMD 感覺很像,也很容易弄混,但其實搞清楚很簡單,
思考下面的關係
dockerfile -> docker image -> container
- 從 dockerfile -> docker image,是 docker build,也就是 RUN 作用的時間
- 從 docker image -> container,是 docker run,也就是 CMD 作用的時間
(optional) MAINTAINER
就是作個紀錄,紀錄誰在維護這份檔案
MAINTAINER Howard Weng
隨便寫一個 ubuntu 20.04 的範例
建立 Dockerfile (注意大小寫)
預設會要建立一個乾淨的資料夾,
在裡面放上一個檔案名稱為 Dockerfile (注意大小寫)
然後這邊我們就單純直接去拉乾淨的別人寫好的 image
FROM ubuntu:20.04
docker build
在同一個資料夾下,去建立一個新的 docker image
docker build -t ubuntu_2004 . --no-cache
就完成了,結果類似以下這樣,我們建立了一個新的 docker image