Dockerfile 语法结构
Dockerfile 是构建镜像的脚本文件,下面介绍基础指令的用法。
基本结构
dockerfile
# 基础镜像
FROM ubuntu:22.04
# 维护者信息(已废弃,使用 LABEL)
LABEL maintainer="user@example.com"
# 执行命令
RUN apt-get update && apt-get install -y nginx
# 拷贝文件
COPY nginx.conf /etc/nginx/nginx.conf
# 工作目录
WORKDIR /app
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
核心指令
FROM - 基础镜像
dockerfile
# 指定基础镜像
FROM ubuntu:22.04
# 使用精简基础镜像
FROM alpine:3.18
FROM node:18-alpine
每条 Dockerfile 必须以 FROM 开始,可有多条(多阶段构建)。
RUN - 构建时执行
dockerfile
# Shell 格式
RUN apt-get update && apt-get install -y nginx
# Exec 格式(推荐)
RUN ["apt-get", "update"]
# 多条 RUN 合并(减少层数)
RUN apt-get update && \
apt-get install -y nginx && \
rm -rf /var/lib/apt/lists/*
每条 RUN 指令创建新层,合并指令减少镜像层数。
COPY vs ADD
dockerfile
# COPY - 仅拷贝文件(推荐)
COPY app.jar /app/app.jar
COPY requirements.txt .
# ADD - 额外功能(自动解压 tar 包)
ADD app.tar.gz /app/
优先使用 COPY,ADD 仅在需要自动解压或远程 URL 时使用。
CMD - 容器启动命令
dockerfile
# Exec 格式(推荐)
CMD ["nginx", "-g", "daemon off;"]
# Shell 格式
CMD nginx -g 'daemon off;'
# 可被 docker run 覆盖
# docker run my-image custom-command
CMD 定义容器默认启动命令,
docker run可覆盖。Exec 格式不会启动 shell 进程。
ENTRYPOINT - 入口点
dockerfile
# 设置固定入口程序
ENTRYPOINT ["nginx"]
# 配合 CMD 提供默认参数
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
# 运行时可追加参数
# docker run my-image -t 1
ENV - 环境变量
dockerfile
# 设置环境变量
ENV NODE_ENV=production
ENV APP_HOME=/app
ENV PORT=3000
# 使用变量
WORKDIR $APP_HOME
完整示例
dockerfile
# 基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 拷贝依赖文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 拷贝应用代码
COPY . .
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["node", "server.js"]
要点总结
- FROM 指定基础镜像,必须是第一条指令
- RUN 在构建时执行命令,合并多条指令减少层数
- COPY 仅拷贝文件,ADD 支持自动解压和远程 URL
- CMD 定义默认启动命令,可被 docker run 覆盖
- ENTRYPOINT 设置固定入口程序,配合 CMD 提供默认参数
- ENV 设置环境变量,在后续指令中可引用
📝 发现内容有误?点击此处直接编辑