DockerFile命令
1. 基础指令命令作用示例FROM指定基础镜像所有 Dockerfile 必须以 FROM 开头FROM ubuntu:20.04基于 Ubuntu 20.04FROM mysql:5.7基于 MySQL 5.7MAINTAINER过时声明镜像维护者推荐用 LABEL 替代MAINTAINER gao gaoexample.comLABEL添加镜像元数据如作者、版本、描述可自定义键值对LABEL authorgao version1.0 description测试镜像2. 构建过程指令命令作用示例RUN构建镜像时执行的命令如安装软件、创建目录分shell/exec格式RUN apt update apt install nginx -y安装 NginxRUN [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.8ENV MYSQL_ROOT_PASSWORD1234563. 容器运行指令命令作用示例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以 UID1000 的用户运行ONBUILD触发指令当前镜像作为基础镜像时子镜像构建时执行ONBUILD COPY ./app /usr/local/app子镜像构建时自动复制文件核心示例一个完整的 Dockerfile构建 Java 应用镜像# 基础镜像Java 8 FROM openjdk:8-jdk-alpine # 维护者信息 LABEL authorgao version1.0 # 设置工作目录 WORKDIR /usr/local/app # 复制jar包到镜像 COPY ./demo-0.0.1-SNAPSHOT.jar app.jar # 暴露端口 EXPOSE 8080 # 容器启动命令 ENTRYPOINT [java, -jar] CMD [app.jar]关键注意事项分层构建每个RUN/COPY/ADD都会生成新镜像层尽量合并命令如RUN apt update apt install -y nginx vim减少层数CMD vs ENTRYPOINTCMD可被docker run命令覆盖如docker run 镜像名 echo test会替换 CMDENTRYPOINT固定入口docker run传参会作为其参数如docker run 镜像名 --server.port8081镜像瘦身用alpine版本基础镜像体积小构建后清理缓存如RUN apt clean rm -rf /var/lib/apt/lists/*。总结Dockerfile 核心是「分层构建」FROM是基础RUN/COPY构建镜像内容CMD/ENTRYPOINT定义容器启动行为优先用COPY而非ADDWORKDIR替代cd合并RUN命令减少镜像层数构建镜像命令docker build -t 镜像名:版本 Dockerfile所在目录如docker build -t myapp:1.0 .。