Dockerfile 核心基础命令(精简版,适配你 Alpine + docker-compose 运维场景)
语法:指令大写,后面跟参数;从上到下顺序执行,每一条指令会生成一层镜像层。
1. FROM 【必须第一条】指定基础镜像
# 格式 FROM 镜像名:tag
FROM alpine:3.22
# FROM ubuntu:24.04
- 所有Dockerfile第一行,代表基于哪个镜像开始构建
- tag不要省略,不要直接写
alpine(会拉latest,版本不可控)
2. RUN 执行shell命令(构建镜像阶段执行)
⚠️ 是打包镜像的时候运行,不是容器启动后!
`dockerfile
alpine安装包
RUN apk add –no-cache curl ca-certificates
debian/ubuntu
RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*
- 多条命令尽量**合并成一个RUN**,减少镜像层数
```dockerfile
# 推荐(一条RUN)
RUN apk add --no-cache curl wget netcat-openbsd3. WORKDIR 设置容器内工作目录
WORKDIR /app
- 等价于
cd /app,后续命令默认在这个目录执行 - 目录不存在会自动创建
4. COPY 把宿主机文件/目录复制进镜像
# 宿主机当前目录的文件 → 容器内/app/
COPY update-docker-compose.sh /app/
COPY ./src /app/src
仅复制构建上下文内的文件,不会访问宿主机上下文外路径
5. ADD (增强版COPY,不推荐日常使用)
- 额外支持:自动解压tar压缩包、远程url下载文件
ADD app.tar.gz /app普通文件复制优先用
COPY,更清晰。
6. ENV 设置环境变量(镜像内全局)
ENV TZ=Asia/Shanghai
ENV APP_PORT=8080
容器启动后,进程能读取这个环境变量。
7. EXPOSE 声明要暴露的端口(仅仅是文档声明,不会真正开放端口)
EXPOSE 8080
只是标记,不负责端口映射;端口映射是
docker run -p或compose里ports做的。
8. CMD 容器启动时默认执行命令(容器运行阶段)
一个Dockerfile只能有一条CMD,多条只有最后一条生效
`dockerfile
数组写法(推荐,不会经过shell)
CMD [“/bin/sh”, “./start.sh”]
shell写法
CMD ./start.sh
区别:
- RUN:**build构建镜像阶段执行**(打包时)
- CMD:**docker run启动容器才执行**
## 9. ENTRYPOINT 容器入口程序
ENTRYPOINT 是容器主程序,CMD可以给它传参数
```dockerfile
ENTRYPOINT ["/app/start.sh"]
CMD ["--debug"]10. USER 指定运行用户(安全最佳实践,不使用root)
RUN adduser -D appuser
USER appuser
后面所有RUN/CMD都会切换为appuser用户运行。
11. VOLUME 声明数据卷
VOLUME ["/data"]
构建时声明目录,容器运行自动挂载匿名卷,Dockerfile里不能指定宿主机路径。
12. ARG 构建阶段参数(build的时候传入,容器运行后消失)
ARG VERSION=v1.0
构建传参:
docker build --build-arg VERSION=v2.0 -f Dockerfile.alpine-prod-build -t myimg .
ARG只在build阶段可用,容器启动后看不到;ENV容器内一直存在。
13. LABEL 添加元数据(作者、描述)
LABEL maintainer="admin@aiwaly.com"
LABEL description="alpine3.22 with curl"
常用指令对比(重点区分,很容易混淆)
| 指令 | 执行时机 | 用途 |
|---|---|---|
| FROM | 构建开始 | 基础镜像 |
| RUN | build打包镜像 | 安装软件、编译、准备文件 |
| COPY | build打包 | 拷贝宿主机文件进镜像 |
| WORKDIR | build打包 | 设置默认目录 |
| CMD | 容器run启动 | 容器默认启动命令 |
| EXPOSE | build打包 | 端口标记,纯文档 |
| ENV | build打包 | 写入永久环境变量 |
完整示例:你的 Dockerfile.alpine-prod-build
FROM alpine:3.22
LABEL maintainer="aiwaly"
# 设置时区
ENV TZ=Asia/Shanghai
# 安装curl、证书
RUN apk add --no-cache curl ca-certificates
WORKDIR /app
# 复制脚本
COPY ./update-docker-compose.sh /app/
RUN chmod +x /app/update-docker-compose.sh
EXPOSE 8080
CMD ["/bin/sh"]
构建命令回顾(对应这个文件)
docker build -f Dockerfile.alpine-prod-build -t harbor.aiwaly.com/base/alpine322-curl:v1 .
最佳实践要点(生产镜像)
- 尽量合并多个RUN,减少镜像层数,降低体积
- alpine必须用
--no-cache,不缓存apk索引 - 不要安装多余包,镜像越小漏洞越少
- 优先COPY,少用ADD
- 尽量不要长期用root运行容器,用USER降权
要不要我给你整理一份Dockerfile 速记卡片方便复制查阅?
作者:月影鹏鹏 创建时间:2026-10-15 10:42
最后编辑:月影鹏鹏 更新时间:2026-10-15 10:43
最后编辑:月影鹏鹏 更新时间:2026-10-15 10:43