构建映像

Docker SELF
等級 13 , 課堂 3
開放

4.1 docker build 指令基礎概念

docker build 指令 是從 Dockerfile 中創建 Docker 映像的主要方式。它會從 Dockerfile 中讀取指令,一步步執行,生成由多層構成的映像。在這部分的講座中,我們會討論 docker build 指令的工作原理、它有哪些參數,以及如何在實踐中使用它。

docker build 指令 能從 Dockerfile 和所謂的構建上下文中構建一個映像。構建上下文是 Docker 用於創建映像的文件,這可能是你機器上的本地目錄,或者例如 GitHub 上的倉庫。

語法


docker build [OPTIONS] PATH | URL | -

其中:

  • PATH: 包含 Dockerfile 和構建上下文的目錄路徑。
  • URL: 遠端倉庫的 URL 地址。
  • -: 從標準輸入(stdin)讀取 Dockerfile。

基本使用範例

在這個範例中,Docker 將使用當前目錄 (.) 中的 Dockerfile 來創建一個名為 myimage 並帶有標籤 latest 的映像。

Terminal

docker build -t myimage:latest .

4.2 自訂 build 指令

docker build 指令的主要參數

docker build 指令支援許多選項,可以自訂建立過程。

1. 參數 -t, --tag

參數 -t--tag 用於為建立的映像賦予名稱和標籤。

Terminal

docker build -t myimage:latest .

2. 參數 -f, --file

參數 -f--file 允許指定替代的 Dockerfile,如果它與預設的 Dockerfile 不同。

Terminal

docker build -f Dockerfile.dev -t myimage:dev .

3. 參數 --build-arg

參數 --build-arg 用於傳遞透過 Dockerfile 中 ARG 指令定義的建立參數。

Terminal

docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .

4. 參數 --no-cache

參數 --no-cache 允許不使用快取進行建立。如果需要確保所有指令都重新執行,這將非常有用。

Terminal

docker build --no-cache -t myimage:latest .

5. 參數 --target

參數 --target 用於在多階段建立中指定目標階段。

Terminal

docker build --target builder -t myimage:builder .

6. 參數 --rm

參數 --rm 指示 Docker 成功建立映像後刪除中間容器(預設啟用)。

Terminal

docker build --rm -t myimage:latest .

4.3 docker build範例

範例 1: 基本建立

假設你有一個簡單的Node.js應用程式,並且想要建立一個Docker映像檔來進行部署。

Dockerfile:

dockerfile

FROM node:14

WORKDIR /app
        
COPY package*.json ./
RUN npm install
        
COPY . .
        
EXPOSE 3000
        
CMD ["node", "app.js"]

建立命令:

Terminal

docker build -t mynodeapp:latest .

在此範例中,Docker會使用目前目錄中的Dockerfile來建立標籤為latest的映像檔mynodeapp

範例 2: 使用參數進行建立

建立參數允許在構建期間向Dockerfile中傳遞變數。

Dockerfile

dockerfile

FROM node:14

ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
        
WORKDIR /app
        
COPY package*.json ./
RUN npm install
        
COPY . .
        
EXPOSE 3000
        
CMD ["node", "app.js"]

建立命令:

Terminal

docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .

在此範例中,參數APP_VERSION被傳遞到Dockerfile中,這使得在構建期間可以設定應用程式的版本。

範例 3: 多階段建立

多階段建立用於創建僅包含必要元件的映像檔。這有助於減少最終映像檔的大小。

Dockerfile

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

建立命令:

Terminal


docker build -t mywebapp:latest .

在此範例中,首先會創建一個中間映像檔builder,應用程式的建置過程在其中進行。建置完成後,應用程式會被傳遞到最終映像檔中,該映像檔會使用Nginx來服務最終的靜態內容。

4.4 實用建議

1. 優化指令順序

為了更有效地利用 Docker 的快取,正確地安排指令順序很重要。舉例來說,先拷貝不常變更的檔案,例如 package.json,以最小化重新安裝相依的次數。接下來再拷貝其餘的檔案。

dockerfile

COPY package*.json ./
RUN npm install
COPY . .

2. 使用 .dockerignore

新增 .dockerignore 檔案以排除不必要的檔案和目錄,從而減少建構上下文的大小並加快映像檔的建立速度。

.dockerignore 範例:

Text

node_modules
dist
*.log

3. 多階段建構

使用多階段建構來創建精簡的映像檔。這種方式能讓你只包含應用程式運行所需的檔案和相依性,並從最終的映像檔中排除不必要的數據,例如暫時檔案或原始碼。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION