Dockerfile是容器化中的關鍵元件,使開發人員和 DevOps 工程師能夠將應用程式及其所有依賴項打包到可移植的輕量級容器中。本指南將提供 Dockerfile 的全面演練,從基礎知識開始,逐步發展到進階技術。最後,您將具備編寫高效、安全且可用於生產的 Dockerfile 的技能。
3.1 Dockerfile語法
3.2常用指令
Dockerfile是一個純文字文件,其中包含一系列用於建立 Docker 映像的指令。 Dockerfile 中的每一行代表映像建置過程中的一個步驟。建立的映像是一個輕量級、可移植且自給自足的環境,包含執行應用程式所需的一切,包括程式庫、依賴項和應用程式程式碼本身。
Docker 映像的起點。例如,如果您正在建立 Python 應用程式,則可以從python:3.9
作為基礎映像開始。
將程式碼新增至映像中,並安裝相依性以確保應用程式正確運作。
執行命令、設定環境變數和公開連接埠的說明。
一個 Dockerfile:
標準化應用程式的建置和部署方式。
確保不同環境(開發、測試、生產)之間的一致性。
使應用程式可移植且更易於管理。
Dockerfile 是容器化的基礎,也是 DevOps 工程師的關鍵技能。這就是為什麼學習它們至關重要:
想像一個在 Node.js 上執行的 Web 應用程式。 Dockerfile 不需要開發人員在本地安裝 Node.js,而是可以使用所需的 Node.js 確切版本打包應用程式,從而確保所有環境中的一致性。
了解 Dockerfile 的基礎知識對於編寫有效且實用的 Dockerfile 至關重要。讓我們探討一下基本要素。
Dockerfile 包含簡單的指令,其中每個指令執行特定的操作。語法一般是:
INSTRUCTION arguments
例如:
FROM ubuntu:20.04
COPY . /app
RUN apt-get update && apt-get install -y python3
CMD ["python3", "/app/app.py"]
要點:
FROM
、 COPY
、 RUN
和CMD
等指令區分大小寫並以大寫形式編寫。
每個指令都會在 Docker 映像中建立一個新圖層。
讓我們分解一些最常用的指令:
FROM
指定建置的基礎映像。
例子:
FROM python:3.9
FROM
指令開頭,多階段建置除外。COPY
將檔案或目錄從主機系統複製到容器中。
例子:
COPY requirements.txt /app/
RUN
在建置過程中執行命令。常用於安裝軟體包。
例子:
RUN apt-get update && apt-get install -y curl
CMD
指定容器啟動時執行的預設命令。
例子:
CMD ["python3", "app.py"]
WORKDIR
設定容器內的工作目錄。
例子:
WORKDIR /usr/src/app
EXPOSE
記錄容器偵聽的連接埠。
例子:
EXPOSE 8080
一旦您了解了基礎知識,您就可以開始使用 Dockerfiles 的更高級功能來優化和增強您的建置。
多階段建置可讓您透過分離建置和執行時間環境來建立精實生產映像。
第 1 階段(建構器):安裝依賴項、編譯程式碼並建置應用程式。
第 2 階段(生產):僅複製建置階段所需的文件。
例子:
# Stage 1: Build the application
FROM node:16 AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
# Stage 2: Run the application
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
好處:
較小的生產圖像。
使建置工具遠離執行時間環境,從而提高安全性。
環境變數使 Dockerfile 更加靈活和可重複使用。
例子:
ENV APP_ENV=production
CMD ["node", "server.js", "--env", "$APP_ENV"]
使用ENV
定義變數。
使用docker run -e
在執行時覆蓋變數:
docker run -e APP_ENV=development myapp
HEALTHCHECK
指令定義了檢查容器運作狀況的指令。
例子:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost:8080/health || exit 1
目的:確保容器內的應用程式能如預期運作。
自動重啟:如果健康檢查失敗,Docker可以重新啟動容器。
先進的技術可協助您建立最佳化、安全且可立即投入生產的映像。
alpine
。 FROM python:3.9-alpine
RUN apt-get update && apt-get install -y curl && apt-get clean
建置參數 ( ARG
) 允許在建置期間動態配置映像。
例子:
ARG APP_VERSION=1.0
RUN echo "Building version $APP_VERSION"
在建置期間傳遞值:
docker build --build-arg APP_VERSION=2.0 .
建立和使用非 root 使用者以增強安全性。
RUN adduser --disabled-password appuser
USER appuser
堅持使用官方或經過驗證的圖像以降低漏洞風險。
FROM nginx:stable
使用Trivy或Snyk等工具掃描影像:
trivy image myimage
使用 Dockerfile 時,在映像建置或執行時遇到錯誤是很常見的。有效的除錯和故障排除技能可以節省時間並幫助快速找出問題。
--target
標誌在多階段 Dockerfile 中建置特定階段。這使您可以隔離建置過程不同階段的問題。 docker build --target builder -t debug-image .
docker history
查看映像層並辨識不必要的命令或問題: docker history <image_id>
RUN
進行除錯RUN
指令。例如,新增echo
語句可以幫助驗證檔案路徑或配置: RUN echo "File exists:" && ls /path/to/file
docker logs
: docker logs <container_id>
.dockerignore
檔案來過濾檔案。原因:使用COPY
或ADD
複製的檔案在指定路徑中不存在。
修復:驗證檔案路徑並使用WORKDIR
設定正確的目錄。
原因:缺少依賴項或安裝指令不正確。
修復:在安裝軟體之前使用RUN
apt-get update
update )。
原因:以錯誤的使用者身分執行進程或存取檔案。
修復:使用USER
指令切換到非root用戶。
若要建立乾淨、有效率且安全的 Dockerfile,請遵循以下業界認可的最佳實務:
latest
標籤,因為它們可能會在發布新版本時引入不一致。 FROM python:3.9-alpine
RUN
指令都會建立一個新圖層,因此最小化它們有助於最佳化圖片大小。 RUN apt-get update && apt-get install -y curl && apt-get clean
.dockerignore
文件.dockerignore
文件,防止不必要的文件(例如.git
、日誌或大型資料集)包含在建置上下文中: node_modules
*.log
.git
alpine
或特定於語言的精簡版本)來減少映像大小。 FROM node:16-alpine
LABEL
指令加入有關圖像的元資料,例如版本、作者和描述: LABEL maintainer="[email protected]"
LABEL version="1.0"
RUN adduser --disabled-password appuser
USER appuser
RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/*
如果編寫不正確,Dockerfile 很快就會變得低效且不安全。以下是一些常見錯誤以及如何避免這些錯誤:
問題:從大型基礎映像開始會增加建置時間和磁碟使用量。
解決方案:使用輕量基礎映像,例如alpine
或語言映像的精簡版本。
FROM python:3.9-alpine
問題:在最終映像中包含建置工具會不必要地增加大小。
解決方案:使用多階段建置僅將所需的檔案複製到生產映像中。
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o app
FROM alpine:latest
COPY --from=builder /app/app /app
CMD ["/app"]
問題:在 Dockerfile 中儲存敏感資料(例如 API 金鑰或密碼)存在安全風險。
解決方案:使用環境變數或秘密管理工具:
ENV DB_PASSWORD=${DB_PASSWORD}
問題:保留快取檔案或安裝包會使映像膨脹。
解決方案:在相同RUN
指令中清理安裝殘留:
RUN apt-get install -y curl && rm -rf /var/lib/apt/lists/*
問題:缺乏註解使得其他人很難理解特定命令的用途。
解決方案:加入有意義的註解來解釋指令:
# Set working directory
WORKDIR /usr/src/app
Dockerfile 是建置高效能、安全容器的基石。透過掌握 Dockerfile 語法、了解最佳實務並避免常見陷阱,您可以簡化應用程式容器化流程,以實現跨環境的一致部署。
從最小的基礎鏡像開始,以減小尺寸並提高性能。
利用多階段建構生產級映像。
始終測試和除錯您的 Dockerfile 以確保可靠性。
實施安全最佳實踐,例如非 root 使用者和秘密管理。
使用.dockerignore
排除不必要的文件,優化建置上下文。
嘗試為您的專案編寫基本和多階段 Dockerfile。
應用最佳實務並將除錯技術整合到您的工作流程中。
與您的團隊分享您的 Dockerfile 以促進協作和回饋。
透過遵循這份全面的指南,您不僅可以建立強大的 Dockerfile,還可以增強您作為 DevOps 專業人員的技能,為高效的 CI/CD 工作流程和可擴展系統做出貢獻。
加入我們的Telegram 社群||在 GitHub 上關注我以獲取更多 DevOps 內容!
原文出處:https://dev.to/prodevopsguytech/writing-a-dockerfile-beginners-to-advanced-31ie