15.7.1 Dockerfile语法与指令详解
Dockerfile语法与指令详解#
Dockerfile 是镜像构建的声明式脚本,按“自上而下”顺序执行。核心目标是可复现、可维护、可审计。本节通过语法规则、指令详解、构建示例、排错与练习,建立可落地的 Dockerfile 编写习惯。
1. 原理草图:Dockerfile 到镜像的构建链路#
2. 基本语法规则(含示例)#
- 一行一条指令:
INSTRUCTION arguments - 指令名不区分大小写,但推荐全大写
- 使用
\续行 - 注释以
#开头
示例:
# /opt/demo/Dockerfile
FROM ubuntu:22.04
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*
3. 常用指令详解与示例(含命令解释)#
3.1 FROM#
指定基础镜像,必须为第一条非注释指令
示例:
FROM alpine:3.19
3.2 LABEL#
添加元数据,方便检索
示例:
LABEL maintainer="ops@example.com" \
app="demo" \
version="1.0.0"
3.3 RUN#
构建阶段执行命令,产生新层
示例:
RUN apk add --no-cache bash curl
命令解释:
- apk add --no-cache:安装包且不保存索引,减小镜像
3.4 CMD 与 ENTRYPOINT#
- CMD:默认启动命令,可被
docker run覆盖 - ENTRYPOINT:固定主进程,避免被覆盖
示例:
ENTRYPOINT ["nginx","-g","daemon off;"]
CMD ["-c","/etc/nginx/nginx.conf"]
3.5 EXPOSE#
声明容器对外服务端口
EXPOSE 80 443
3.6 ENV#
设置环境变量
ENV APP_ENV=prod APP_PORT=8080
3.7 WORKDIR#
设置工作目录
WORKDIR /app
3.8 COPY 与 ADD#
- COPY:复制文件/目录
- ADD:支持解压与远程 URL(谨慎)
COPY ./src /app
3.9 VOLUME#
声明数据卷
VOLUME ["/data"]
3.10 USER#
降权运行
RUN adduser -D appuser
USER appuser
3.11 ARG#
构建时变量
ARG BUILD_VERSION
ENV APP_VERSION=$BUILD_VERSION
3.12 HEALTHCHECK#
健康检查
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/ || exit 1
4. 完整示例:构建一个 Nginx 静态站点镜像#
4.1 准备目录#
mkdir -p /opt/demo/html
cd /opt/demo
cat > html/index.html <<'EOF'
<h1>Hello Dockerfile</h1>
EOF
4.2 Dockerfile#
# /opt/demo/Dockerfile
FROM nginx:1.25-alpine
LABEL maintainer="ops@example.com" app="static-site"
WORKDIR /usr/share/nginx/html
COPY ./html/ /usr/share/nginx/html/
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/ || exit 1
4.3 构建镜像#
cd /opt/demo
docker build -t demo-nginx:1.0 .
命令解释:
- docker build:执行构建
- -t:为镜像打标签
4.4 运行容器#
docker run -d --name demo-nginx -p 8080:80 demo-nginx:1.0
预期效果:
- 浏览器访问 http://localhost:8080 显示 Hello Dockerfile
5. 常见问题与排错#
5.1 COPY 失败:找不到文件#
排查步骤:
# 确认构建上下文
pwd
ls -l
# 重新构建并显示详细输出
docker build --no-cache -t demo-nginx:1.0 .
原因:构建上下文外的文件无法被 COPY
5.2 RUN 安装失败:源不可用#
排查步骤:
docker build -t demo-nginx:1.0 . --progress=plain
改用国内镜像或添加重试:
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
5.3 CMD/ENTRYPOINT 行为不符合预期#
验证启动命令:
docker inspect demo-nginx:1.0 | grep -A3 Cmd
docker run --rm demo-nginx:1.0 nginx -V
确保 JSON 数组格式正确,避免 shell 模式带来参数解析问题。
6. 练习题(含参考命令)#
1) 写一个 Dockerfile 安装 curl 并输出版本
- 参考:
FROM alpine:3.19
RUN apk add --no-cache curl
CMD ["curl","--version"]
2) 构建并运行,输出 curl 版本
docker build -t demo-curl:1.0 .
docker run --rm demo-curl:1.0
3) 使用 ARG 控制构建版本号
FROM alpine:3.19
ARG BUILD_VERSION
ENV APP_VERSION=$BUILD_VERSION
CMD ["sh","-c","echo $APP_VERSION"]
docker build -t demo-arg:1.0 --build-arg BUILD_VERSION=2024.01 .
docker run --rm demo-arg:1.0
通过以上示例,你可以掌握 Dockerfile 的核心语法、指令语义、常见排错方法与实战构建流程,为后续的镜像瘦身与多阶段构建打下基础。