Dockerfile 常见语法和指令
Dockerfile 常见语法和指令
-
FROM
- 作用: 指定基础镜像,构建过程从该镜像开始。
- 语法:
FROM <image>[:<tag>] [AS <name>]
- 示例:
指定使用FROM node:18.18.0-alpine AS builder
node:18.18.0-alpine
作为基础镜像,并命名为builder
(用于多阶段构建)。
-
WORKDIR
- 作用: 设置容器内的工作目录,后续指令(如
COPY
、RUN
)都在此目录下执行。 - 语法:
WORKDIR /path/to/workdir
- 示例:
设置工作目录为WORKDIR /app
/app
。
- 作用: 设置容器内的工作目录,后续指令(如
-
COPY
- 作用: 将文件或目录从主机复制到容器内的指定路径。
- 语法:
COPY [--chown=<user>:<group>] <src> <dest>
- 示例:
将主机的COPY package*.json ./
package.json
和package-lock.json
复制到容器的工作目录。
-
ADD
- 作用: 类似
COPY
,但支持从 URL 下载文件或解压 tar 文件。 - 语法:
ADD <src> <dest>
- 示例:
将当前目录下的所有文件复制到容器内的ADD . /app
/app
目录。
- 作用: 类似
-
RUN
- 作用: 在构建镜像时执行命令,通常用于安装依赖、运行脚本等。
- 语法:
- Shell 格式:
RUN <command>
- Exec 格式:
RUN ["executable", "param1", "param2"]
- Shell 格式:
- 示例:
在构建时执行RUN npm install --loglevel verbose
npm install
安装依赖。
-
CMD
- 作用: 指定容器启动时默认执行的命令(仅一个
CMD
有效)。 - 语法:
- Shell 格式:
CMD <command>
- Exec 格式:
CMD ["executable", "param1", "param2"]
- Shell 格式:
- 示例:
容器启动时运行 Nginx,并保持前台运行。CMD ["nginx", "-g", "daemon off;"]
- 作用: 指定容器启动时默认执行的命令(仅一个
-
EXPOSE
- 作用: 声明容器运行时监听的端口(仅起文档作用,不自动发布端口)。
- 语法:
EXPOSE <port> [<port>/<protocol>]
- 示例:
声明容器监听 80 端口。EXPOSE 80
-
ENV
- 作用: 设置环境变量,可在后续指令或容器运行时使用。
- 语法:
ENV <key>=<value>
- 示例:
设置时区为ENV TZ=Asia/Shanghai
Asia/Shanghai
。
-
ARG
- 作用: 定义构建时的变量,仅在构建过程中有效(不会传递到运行时的容器)。
- 语法:
ARG <name>[=<default value>]
- 示例:
定义变量ARG BUILD="npm run build"
BUILD
,默认值为npm run build
。
-
LABEL
- 作用: 为镜像添加元数据(如维护者、版本等)。
- 语法:
LABEL <key>=<value> ...
- 示例:
添加维护者信息。LABEL maintainer="****"
-
ENTRYPOINT
- 作用: 指定容器启动时执行的命令,适合定义容器的主要可执行程序。
- 语法:
- Shell 格式:
ENTRYPOINT <command>
- Exec 格式:
ENTRYPOINT ["executable", "param1", "param2"]
- Shell 格式:
- 示例:
容器启动时运行ENTRYPOINT ["node", "app.js"]
node app.js
。
-
VOLUME
- 作用: 定义匿名卷,用于持久化数据。
- 语法:
VOLUME <path>
- 示例:
创建一个挂载点VOLUME /data
/data
。
-
USER
- 作用: 指定后续指令或容器运行时的用户(默认是 root)。
- 语法:
USER <user>[:<group>]
- 示例:
以USER nginx
nginx
用户运行后续命令。
-
HEALTHCHECK
- 作用: 定义容器健康检查的方式。
- 语法:
每 30 秒检查容器健康状态。HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
-
ONBUILD
- 作用: 定义当该镜像被用作其他镜像的基础镜像时触发的指令。
- 语法:
ONBUILD <instruction>
- 示例:
当其他镜像基于此镜像时,复制文件到ONBUILD COPY . /app
/app
。
-
Multi-Stage Builds
- 作用: 使用多个
FROM
指令实现多阶段构建,优化镜像大小。 - 示例:
从FROM node:18.18.0-alpine AS builder # 构建阶段 FROM nginx:stable-alpine COPY --from=builder /app/dist /usr/share/nginx/html
builder
阶段复制构建产物到最终镜像。
- 作用: 使用多个
Dockerfile 语法特点
- 指令大小写: 指令通常大写(如
FROM
、RUN
),但不强制。 - 注释: 以
#
开头。# This is a comment
- 多行指令: 使用反斜杠
\
换行。RUN npm config set registry https://registry.npmmirror.com/; \npm install --loglevel verbose
- 指令顺序: Dockerfile 按顺序执行,每条指令创建一个新层。
- 缓存机制: Docker 会缓存每层的结果,修改 Dockerfile 可能导致缓存失效。
最佳实践
- 最小化镜像: 使用轻量级基础镜像(如
alpine
),清理不必要的文件。 - 合并命令: 减少
RUN
指令层数,合并多条命令。RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
- 多阶段构建: 仅将必要文件复制到最终镜像。
- 明确版本: 指定镜像版本(如
node:18.18.0-alpine
),避免使用latest
。 - 避免不必要的文件: 使用
.dockerignore
排除无关文件(如node_modules
)。
示例
# Stage 1: Build
FROM node:16.17.0-alpine AS builder
ARG BUILD="npm run build"
WORKDIR /app
COPY package*.json ./
RUN npm config set registry http://<REDACTED_REGISTRY>; \npm install --loglevel verbose
ADD . /app
RUN $BUILD# Stage 2: Production
FROM <REDACTED_REGISTRY>/nginx:stable-alpine-v2
LABEL maintainer="<REDACTED_MAINTAINER>"
ARG TARGET_FILE="dist"
ENV TZ=Asia/Shanghai
COPY --from=builder /app/$TARGET_FILE /usr/share/nginx/html
RUN set -eux; \ln -snf /usr/share/zoneinfo/$TZ /etc/localtime; \echo $TZ > /etc/timezone
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
使用说明
- 文件作用: 该 Dockerfile 定义了一个两阶段构建过程:
- 第一阶段使用 Node.js 环境构建前端项目(默认运行
npm run build
)。 - 第二阶段使用 Nginx 镜像,将构建产物复制到 Nginx 的 HTML 目录,配置时区并启动 Nginx 服务。
- 第一阶段使用 Node.js 环境构建前端项目(默认运行
- 如何使用:
- 保存 Dockerfile 到本地。
- 替换
<REDACTED_XXX>
占位符为实际的 registry 地址和维护者信息。 - 运行
docker build -t my-image .
构建镜像。 - 运行
docker run -p 80:80 my-image
启动容器。