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-openbsd

3. 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 .

最佳实践要点(生产镜像)

  1. 尽量合并多个RUN,减少镜像层数,降低体积
  2. alpine必须用 --no-cache,不缓存apk索引
  3. 不要安装多余包,镜像越小漏洞越少
  4. 优先COPY,少用ADD
  5. 尽量不要长期用root运行容器,用USER降权

要不要我给你整理一份Dockerfile 速记卡片方便复制查阅?

作者:月影鹏鹏  创建时间:2026-10-15 10:42
最后编辑:月影鹏鹏  更新时间:2026-10-15 10:43