Dockerfile 常见指令详解

发布于:2025-06-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

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/app

FROM alpine:latest
COPY --from=builder /go/bin/app /usr/local/bin/app
CMD ["app"]

最佳实践

  1. 合并 RUN 指令:减少镜像层数
  2. 使用 .dockerignore:排除不必要的文件
  3. 选择合适的基础镜像:如 alpine 版本更小
  4. 清理缓存:如 apt-get/var/lib/apt/lists/
  5. 指定版本标签:避免使用 latest

示例 Dockerfile

# 多阶段构建示例
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

理解这些指令后,你可以根据需要编写高效的 Dockerfile 来构建优化的 Docker 镜像。


网站公告

今日签到

点亮在社区的每一天
去签到