Dockerfile 是一個文本文件,包含了一系列用于構建 Docker 鏡像的指令。以下是 Dockerfile 中常見指令的詳細解釋:
基礎指令
1. FROM
指定基礎鏡像,必須為第一條指令(注釋除外)。
FROM ubuntu:20.04
FROM python:3.9-slim
2. LABEL
為鏡像添加元數據(鍵值對)。
LABEL maintainer="your.email@example.com"
LABEL version="1.0"
LABEL description="This is a custom image"
3. ENV
設置環境變量,可在后續指令和容器運行時使用。
ENV APP_HOME=/app
ENV PATH=$PATH:/usr/local/bin
4. WORKDIR
設置工作目錄,如果目錄不存在會自動創建。
WORKDIR /app
構建過程指令
5. RUN
在構建過程中執行命令,會創建新的鏡像層。
RUN apt-get update && apt-get install -y \curl \nginx \&& rm -rf /var/lib/apt/lists/*
6. COPY
將文件從構建上下文復制到鏡像中。
COPY . /app
COPY requirements.txt /app/
COPY --from=builder /app/bin /usr/local/bin # 多階段構建中從其他階段復制
7. ADD
類似 COPY,但功能更多(自動解壓 tar 文件,可從 URL 下載)。
ADD https://example.com/file.tar.gz /tmp/
ADD file.tar.gz /tmp/ # 會自動解壓
容器運行時指令
8. CMD
指定容器啟動時的默認命令(可被 docker run
覆蓋)。
CMD ["nginx", "-g", "daemon off;"] # 推薦使用 exec 格式
CMD echo "Hello World" # shell 格式
9. ENTRYPOINT
配置容器啟動時運行的命令(不易被覆蓋)。
ENTRYPOINT ["/app/start.sh"]
10. EXPOSE
聲明容器運行時監聽的端口(不會自動映射)。
EXPOSE 80
EXPOSE 443
其他重要指令
11. ARG
定義構建時的變量(構建后不再存在)。
ARG VERSION=latest
FROM ubuntu:$VERSION
12. VOLUME
創建掛載點,用于持久化數據。
VOLUME /data
13. USER
指定運行后續指令的用戶(和用戶組)。
USER nobody
USER 1000:1000
14. HEALTHCHECK
定義容器健康檢查。
HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost/ || exit 1
15. ONBUILD
添加觸發器,當本鏡像作為基礎鏡像時執行。
ONBUILD COPY . /app/src
ONBUILD RUN make /app/src
多階段構建
16. 多階段構建
減少最終鏡像大小,只保留必要的文件。
FROM golang:1.16 AS builder
WORKDIR /go/src/app
COPY . .
RUN go build -o /go/bin/appFROM alpine:latest
COPY --from=builder /go/bin/app /usr/local/bin/app
CMD ["app"]
最佳實踐
- 合并 RUN 指令:減少鏡像層數
- 使用 .dockerignore:排除不必要的文件
- 選擇合適的基礎鏡像:如 alpine 版本更小
- 清理緩存:如
apt-get
的/var/lib/apt/lists/
- 指定版本標簽:避免使用
latest
示例 Dockerfile
# 多階段構建示例
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run buildFROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
理解這些指令后,你可以根據需要編寫高效的 Dockerfile 來構建優化的 Docker 鏡像。