3.1 指令 FROM
好啦,提醒一下,Dockerfile 是個文字檔案,裡面包含用來建立 Docker 映像檔的指令。Dockerfile 中的每一條指令都執行一個特定的任務,並在映像檔中創建新的一層。在這節課裡,我們會詳細解釋 Dockerfile 的主要指令:FROM
、RUN
、COPY
和 CMD
,這些是創建功能完善且高效的 Docker 映像檔中很重要的指令。
指令 FROM
用來設置基礎映像檔,從中將創建新的映像檔。這是任何 Dockerfile 中的第一條指令,它定義了構建映像檔的起點。
語法
FROM <image>[:<tag>] [AS <name>]
其中:
<image>
: 基礎映像檔的名稱。<tag>
: (可選)基礎映像檔的版本。預設使用latest
。AS <name>
: (可選)為這次構建階段分配一個名稱(在多階段構建中使用)。
範例
使用基礎映像檔 Ubuntu
:
FROM ubuntu:20.04
使用官方映像檔 Node.js
:
FROM node:14
使用多階段構建進行優化:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
這個範例中使用了兩個基礎映像檔。第一個(node:14) 用於構建應用程式,第二個(nginx:alpine) 用於創建輕量化的伺服器,來提供靜態檔案。
由於使用了多階段構建,最終的映像檔僅包含所需的最小檔案和程式(在這個例子中是 Nginx
和已構建的靜態檔案),使其更輕量化且部署更快。
3.2 指令 RUN
指令 RUN
在 container 裡執行命令並建立新的 layer。在構建 image 時,這個指令用於安裝套件、設定環境以及執行其他必要命令。
語法:
RUN <command>
其中:
<command>
: 將在 container 裡執行的命令。
範例:
在 Ubuntu 的 image 中安裝套件:
RUN apt-get update && apt-get install -y curl git
編譯程式碼:
RUN gcc -o myapp myapp.c
合併多個命令
為了減少 layer 數量、減小 image
大小並加快構建速度,建議將多個命令合併到一個 RUN
指令中。
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 指令 COPY
指令 COPY
用於將檔案和目錄從建置的上下文複製到容器的檔案系統中。這對於傳輸原始碼、設定檔和其他資源到容器中很有用。
語法:
COPY <src> <dest>
其中:
<src>
: 建置上下文中的檔案或目錄路徑。<dest>
: 容器中的目標路徑。
範例:
將當前目錄的所有內容複製到容器的工作目錄中:
COPY . /app
複製單個檔案:
COPY package.json /app/package.json
COPY server.js /app/server.js
使用 .dockerignore
可透過使用 .dockerignore
檔案來排除不需要的檔案,以避免在複製過程中包含它們,該檔案的運作方式類似於 .gitignore
。
node_modules
dist
*.log
3.4 指令 CMD
指令 CMD
用來設定在啟動容器時要執行的指令。與 RUN
不同,RUN
是在構建階段執行,而 CMD
則是在從生成的映像啟動容器時執行。
語法:
CMD ["executable","param1","param2"]
或者
CMD command param1 param2
其中:
- ["executable","param1","param2"]: 使用 exec 的形式,這種形式更推薦,因為它可以確保信號能被正確處理。
- command param1 param2: 使用
shell
的形式,在 shell 環境中執行指令。
範例:
運行 Node.js
程式:
CMD ["node", "app.js"]
運行 shell
腳本:
CMD /usr/bin/myscript.sh
CMD
和 ENTRYPOINT
的區別
CMD
設置了默認的指令,可以在啟動容器時覆蓋。 ENTRYPOINT
則設置了不可改變的指令,它將在容器啟動時始終執行。
使用 ENTRYPOINT
的範例:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
在這個範例中,ENTRYPOINT
啟動 Python 腳本,而 CMD
傳遞可在啟動容器時更改的參數。
包含主要指令的 Dockerfile 範例
# 使用 Node.js 的基礎映像
FROM node:14
# 設置工作目錄
WORKDIR /app
# 複製 package.json 和 package-lock.json 文件
COPY package*.json ./
# 安裝依賴
RUN npm install
# 複製應用程序的源代碼
COPY . .
# 指定應用程序將使用的端口
EXPOSE 3000
# 定義啟動應用程序的指令
CMD ["node", "app.js"]
GO TO FULL VERSION