(2)一步步掌握基礎 Docker - DockerFile

前言

接下來我們要來接去前一篇的後半部分,也就是關於 DockerFile 這個檔案。

DockerFile 是什麼?

DockerFile 簡單來講它是一個腳本檔案,這個腳本檔案會告訴 Docker 要做哪些事情進而建立出一個 Docker Image,所以其實 DockerFile 裡面有一些指令你必須要看得懂,這樣子你才會知道 Docker 在做什麼事情。

DockerFile 指令

接下來我們要認識一些指令,如同前面所說,這些指令將會告訴 Docker 要做哪些事情

FROM

告知 Docker 我們目前要使用哪個 Image 作為基底,雖然前面有說明 Image 是映像檔的概念,所以 FROM 就是在告知 Docker 我們要使用哪個映像檔作為基底。

舉例來講,如果我們要使用 Node.js 16.15.0 的話,就要這樣寫

1
FROM node:16.15.0

這樣子 Docker 就會將環境指定 Node.js 16.15.0 了~

RUN

這個指令非常的簡單,其實就是告知 Docker 要執行哪些指令,如果是 Node.js 環境的話,然後你想要執行 app.js 那麼就這樣寫

1
RUN node app.js

RUN 指令的概念就跟你在終端機輸入的行為是一樣的,只是環境變成在 Docker 底下做而已,因此如果是多行指令的話,可以這樣寫

1
2
RUN npm install
RUN npm run build

所以其實非常的簡單,但要注意一行指令只能執行一個指令,但你也可以同時執行多個指令,只要用 && 連接就可以了

1
RUN npm install && npm run build

當然你也有可能看到另一種寫法,也就是陣列形式的寫法

1
2
RUN ["npm", "install"]
RUN ["npm", "run", "build"]

這等價於 npm install 與 npm run build,但是這樣寫的好處是可以避免 Docker 在執行指令的時候,因為你的指令中有空白而造成的錯誤。

那陣列寫法如果也要同時執行多個指令呢?這樣寫就可以了

1
RUN ["npm", "install", "&&", "npm", "run", "build"]

有沒有瞬間看懂一些 Docker 指令了呢?

CMD

另外有一個跟 RUN 很相似的指令,也就是 CMD,但是 CMDRUN 的差別在於 CMD 是在啟動 Container 的時候才會執行,而 RUN 則是在建立 Image 的時候才會執行,因此兩者執行的時間點不同。

這一段應該會有點複雜,這邊先提一個觀念,Dockerfile 在執行時,會依據我們寫的內容一行一行的執行,執行完畢後會封裝成一個 Image,因此 RUN 就會在封裝成 Image 的時候執行,而 CMD 則是在啟動 Container 的時候才會執行。

COPY

這個指令相對比較簡單,就是複製用的,假設你要複製一個檔案到 Docker 環境就這樣寫

1
COPY ./app.js /app/app.js

這一段指令就是將 app.js 複製到 /app/app.js 這個位置,這個位置是相對於 Docker 環境的位置。

但你有可能會看到另一個類似的指令,就是 ADD,這個指令跟 COPY 很類似,以官方建議來講 ADD 已經不被建議使用了。

ENV

其實這個指令應該是滿常用的,就是設定環境變數的,假設我們要設定一個環境變數 NODE_ENV,那麼就這樣寫

1
ENV NODE_ENV production

多個 ENV 的話,可以這樣寫

1
2
ENV NODE_ENV production \
PORT 3000

上面這一段就是設定了兩個環境變數,一個是 NODE_ENV,另一個是 PORT

AVG

AVG 與 ENV 也是非常相似,但是兩種運行的環境是不同的,一個是在建立 Image 的時候,另一個是在啟動 Container 的時候。

概念就像是全域變數跟區域變數,AVG 是全域變數,而 ENV 是區域變數。

EXPOSE

這個指令也是滿常用的,就是告訴 Docker 這個容器會使用哪些 port,假設我們要使用 3000 這個 port,那麼就這樣寫

1
EXPOSE 3000

為什麼要寫 EXPOSE 呢?因為如果你沒有寫,那麼 Docker 就不會知道這個容器會使用哪些 port,因此就會造成一些問題。

WORKDIR

這個指令是在指定我們工作目錄的位置,假設我們要指定工作目錄為 /app,那麼就這樣寫

1
WORKDIR /app

接下來我們的指令都會在 /app 這個目錄下執行。

那麼以上這幾個指令算是是我們比較常見的指令,當然還有其他的,但這邊就只需要知道這些就好。

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ