CodeGym /Adesua ahorow /Docker SELF /Dockerfile 的基本指令

Dockerfile 的基本指令

Docker SELF
等級 13 , 課堂 2
開放

3.1 指令 FROM

好啦,提醒一下,Dockerfile 是個文字檔案,裡面包含用來建立 Docker 映像檔的指令。Dockerfile 中的每一條指令都執行一個特定的任務,並在映像檔中創建新的一層。在這節課裡,我們會詳細解釋 Dockerfile 的主要指令:FROMRUNCOPYCMD,這些是創建功能完善且高效的 Docker 映像檔中很重要的指令。

指令 FROM 用來設置基礎映像檔,從中將創建新的映像檔。這是任何 Dockerfile 中的第一條指令,它定義了構建映像檔的起點。

語法


FROM <image>[:<tag>] [AS <name>]

其中:

  • <image>: 基礎映像檔的名稱。
  • <tag>: (可選)基礎映像檔的版本。預設使用 latest
  • AS <name>: (可選)為這次構建階段分配一個名稱(在多階段構建中使用)。

範例

使用基礎映像檔 Ubuntu

dockerfile


FROM ubuntu:20.04

使用官方映像檔 Node.js

dockerfile


FROM node:14

使用多階段構建進行優化

dockerfile


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 中安裝套件:

dockerfile


RUN apt-get update && apt-get install -y curl git

編譯程式碼:

dockerfile


RUN gcc -o myapp myapp.c

合併多個命令

為了減少 layer 數量、減小 image 大小並加快構建速度,建議將多個命令合併到一個 RUN 指令中。

dockerfile


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>: 容器中的目標路徑。

範例:

將當前目錄的所有內容複製到容器的工作目錄中:

dockerfile


COPY . /app

複製單個檔案:

dockerfile


COPY package.json /app/package.json
COPY server.js /app/server.js

使用 .dockerignore

可透過使用 .dockerignore 檔案來排除不需要的檔案,以避免在複製過程中包含它們,該檔案的運作方式類似於 .gitignore

Text


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 程式:

dockerfile


CMD ["node", "app.js"]

運行 shell 腳本:

dockerfile


CMD /usr/bin/myscript.sh

CMDENTRYPOINT 的區別

CMD 設置了默認的指令,可以在啟動容器時覆蓋。 ENTRYPOINT 則設置了不可改變的指令,它將在容器啟動時始終執行。

使用 ENTRYPOINT 的範例:

dockerfile


ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]

在這個範例中,ENTRYPOINT 啟動 Python 腳本,而 CMD 傳遞可在啟動容器時更改的參數。

包含主要指令的 Dockerfile 範例

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"]
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION