Dockerfile 完全指南

什么是 Dockerfile?

Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于自动化构建 Docker 镜像。通过 Dockerfile,开发者可以定义应用程序运行所需的环境、依赖和配置。

基本结构

一个典型的 Dockerfile 包含以下部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 基础镜像
FROM ubuntu:20.04

# 维护者信息 (已弃用,推荐使用LABEL)
LABEL maintainer="your.email@example.com"

# 设置环境变量
ENV APP_HOME /app
WORKDIR $APP_HOME

# 安装依赖
RUN apt-get update && apt-get install -y \
python3 \
python3-pip

# 复制文件
COPY . .

# 安装Python依赖
RUN pip install -r requirements.txt

# 暴露端口
EXPOSE 8000

# 定义启动命令
CMD ["python3", "app.py"]

常用指令详解

FROM

指定基础镜像,必须为第一条指令:

1
FROM python:3.8-slim

RUN

执行命令并创建新的镜像层:

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

COPY/ADD

复制文件到镜像中:

1
2
COPY ./src /app/src
ADD https://example.com/file.tar.gz /tmp/

CMD

指定容器默认执行的命令(只能有一个):

1
CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT

配置容器启动时运行的命令:

1
ENTRYPOINT ["/app/start.sh"]

EXPOSE

声明容器运行时监听的端口:

1
EXPOSE 80 443

ENV

设置环境变量:

1
ENV NODE_ENV production

WORKDIR

设置工作目录:

1
WORKDIR /app

USER

指定运行时的用户:

1
USER nobody

最佳实践

  1. 使用官方镜像:优先选择官方维护的基础镜像

  2. 多阶段构建:减少最终镜像大小

    1
    2
    3
    4
    5
    6
    7
    FROM node:14 as builder
    WORKDIR /app
    COPY . .
    RUN npm install && npm run build

    FROM nginx:alpine
    COPY --from=builder /app/dist /usr/share/nginx/html
  3. 合并 RUN 指令:减少镜像层数

    1
    2
    3
    RUN apt-get update && \
    apt-get install -y git curl && \
    rm -rf /var/lib/apt/lists/*
  4. 使用.dockerignore:避免复制不必要的文件

    1
    2
    3
    node_modules
    .git
    *.log
  5. 指定版本标签:避免使用 latest 标签

    1
    FROM python:3.8.12-slim

示例:Python 应用 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 多阶段构建示例
FROM python:3.9 as builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt

FROM python:3.9-slim
WORKDIR /app

# 从builder阶段复制已安装的Python包
COPY --from=builder /root/.local /root/.local
COPY . .

# 确保脚本可执行
RUN chmod +x entrypoint.sh

# 添加PATH以便能够找到用户安装的可执行文件
ENV PATH=/root/.local/bin:$PATH

EXPOSE 5000
ENTRYPOINT ["./entrypoint.sh"]

构建和运行

构建镜像:

1
docker build -t my-app:1.0 .

运行容器:

1
docker run -d -p 4000:80 --name my-app-container my-app:1.0

总结

Dockerfile 是 Docker 生态系统的核心组成部分,掌握 Dockerfile 的编写技巧可以显著提高容器化应用的效率和安全性。通过遵循最佳实践,你可以创建出高效、安全且易于维护的 Docker 镜像。