DockerFile命令

1. 基础指令
命令 作用 示例
FROM 指定基础镜像(所有 Dockerfile 必须以 FROM 开头) FROM ubuntu:20.04(基于 Ubuntu 20.04)FROM mysql:5.7(基于 MySQL 5.7)
MAINTAINER(过时) 声明镜像维护者(推荐用 LABEL 替代) MAINTAINER gao <gao@example.com>
LABEL 添加镜像元数据(如作者、版本、描述),可自定义键值对 LABEL author="gao" version="1.0" description="测试镜像"

2. 构建过程指令
命令 作用 示例
RUN 构建镜像时执行的命令(如安装软件、创建目录),分 shell/exec 格式 RUN apt update && apt install nginx -y(安装 Nginx)RUN ["mkdir", "/app"](exec 格式,避免 shell 解析)
COPY 将宿主机文件 / 目录复制到镜像内(仅支持本地文件,不能访问网络) COPY ./app.jar /usr/local/app/(复制 jar 包到镜像)COPY ./conf /etc/nginx/(复制配置目录)
ADD 增强版 COPY(支持解压压缩包、下载网络文件),优先用 COPY(更简洁) ADD https://xxx.tar.gz /tmp/(下载并解压)ADD app.tar.gz /usr/local/(自动解压 tar 包)
WORKDIR 设置后续命令的工作目录(相当于 cd,推荐用绝对路径) WORKDIR /usr/local/app(后续命令都在该目录执行)
ENV 设置环境变量(构建时和容器运行时都生效) ENV JAVA_HOME=/usr/local/jdk1.8``ENV MYSQL_ROOT_PASSWORD=123456

3. 容器运行指令
命令 作用 示例
CMD 容器启动时执行的命令(只能有 1 个生效,被 docker run 命令覆盖) CMD ["nginx", "-g", "daemon off;"](启动 Nginx 前台运行)CMD echo "容器启动成功"
ENTRYPOINT 容器启动的「入口命令」(不会被覆盖,可配合 CMD 传参) ENTRYPOINT ["mysql", "-u", "root", "-p"](固定启动命令)CMD ["123456"](作为 ENTRYPOINT 的参数)
EXPOSE 声明容器暴露的端口(仅标识,不自动映射,需 docker run -p 映射) EXPOSE 80 3306(声明暴露 80 和 3306 端口)
VOLUME 声明容器数据卷(指定挂载目录,运行时自动挂载到宿主机) VOLUME ["/var/lib/mysql"](MySQL 数据目录)VOLUME /app/logs(日志目录)
USER 指定容器运行的用户(默认 root,可切换普通用户) USER nginx(以 nginx 用户运行容器)USER 1000(以 UID=1000 的用户运行)
ONBUILD 触发指令(当前镜像作为基础镜像时,子镜像构建时执行) ONBUILD COPY ./app /usr/local/app(子镜像构建时自动复制文件)

核心示例:一个完整的 Dockerfile(构建 Java 应用镜像)

复制代码
# 基础镜像(Java 8)
FROM openjdk:8-jdk-alpine

# 维护者信息
LABEL author="gao" version="1.0"

# 设置工作目录
WORKDIR /usr/local/app

# 复制jar包到镜像
COPY ./demo-0.0.1-SNAPSHOT.jar app.jar

# 暴露端口
EXPOSE 8080

# 容器启动命令
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]

关键注意事项

  1. 分层构建 :每个 RUN/COPY/ADD 都会生成新镜像层,尽量合并命令(如 RUN apt update && apt install -y nginx vim),减少层数;
  2. CMD vs ENTRYPOINT
    • CMD 可被 docker run 命令覆盖(如 docker run 镜像名 echo "test" 会替换 CMD);
    • ENTRYPOINT 固定入口,docker run 传参会作为其参数(如 docker run 镜像名 --server.port=8081);
  3. 镜像瘦身 :用 alpine 版本基础镜像(体积小),构建后清理缓存(如 RUN apt clean && rm -rf /var/lib/apt/lists/*)。

总结

  1. Dockerfile 核心是「分层构建」,FROM 是基础,RUN/COPY 构建镜像内容,CMD/ENTRYPOINT 定义容器启动行为;
  2. 优先用 COPY 而非 ADDWORKDIR 替代 cd,合并 RUN 命令减少镜像层数;
  3. 构建镜像命令:docker build -t 镜像名:版本 Dockerfile所在目录(如 docker build -t myapp:1.0 .)。
相关推荐
予枫的编程笔记1 个月前
【Docker进阶篇】从入门到精通:Java应用Docker打包,最佳实践与多阶段构建详解
java·docker·容器化·dockerfile·多阶段构建·docker最佳实践·java镜像优化
予枫的编程笔记1 个月前
【Docker基础篇】从0到1写Dockerfile:FROM/COPY/CMD/ENTRYPOINT指令详解+Hello World实战
人工智能·docker·云计算·dockerfile·容器技术·docker入门·docker实战
纯洁的小魔鬼2 个月前
Dockerfile 指令
docker·镜像·dockerfile
眠りたいです2 个月前
Docker核心技术和实现原理第一部分-Docker镜像制作
运维·docker·容器·集群·镜像·dockerfile
key2world3 个月前
Dockerfile 制作镜像和推送
docker·dockerfile·docker push
XHW___0013 个月前
Dockerfile生成镜像
dockerfile
Mr.Ja3 个月前
【Docker 从入门到实战】——解决跨环境部署痛点的完整指南
运维·docker·容器·dockerfile·dockerimage
Garfield20054 个月前
Kubeflow 运行容器时 ENTRYPOINT 被覆盖导致环境变量未生效问题分析与解决
k8s·dockerfile·kubeflow·entrypoint
chen_note5 个月前
Dockerfile及其部署镜像步骤
docker·容器·镜像·dockerfile