5.DockerFile 解析

什么是 Dockerfile

  • Dockerfile 是用来构建 Docker 镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
  • 官网:https://docs.docker.com/engine/reference/builder/
  • 构建三步骤:编写 Dockerfile 文件-->docker build 命令构建镜像-->docker run 依镜像运行容器实例

DockerFile 构建过程解析

bash
docker build -t 机构/镜像名<:tags> Dockerfile目录
  • Dockerfile 内容基础知识
  • 1:每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 2:指令按照从上到下,顺序执行
  • 3:#表示注释
  • 4:每条指令都会创建一个新的镜像层并对镜像进行提交

Docker执行 Dockerfile 的大致流程

  • 1)docker 从基础镜像运行一个容器
  • 2)执行一条指令并对容器作出修改
  • 3)执行类似 docker commit 的操作提交一个新的镜像层
  • 4)docker 再基于刚提交的镜像运行一个新容器
  • 5)执行 dockerfile 中的下一条指令直到所有指令都执行完成

DockerFile 常用保留字指令

  • FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是 from
  • MAINTAINER:镜像维护者的姓名和邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露出的端口
  • WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  • USER:指定该镜像以什么样的用户去执行,如果都不指定,默认是 root
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像且会自动处理 URL 和解压 tar 压缩包
  • COPY:类似 ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径>的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定容器启动后的要干的事情
  • ENTRYPOINT:也是用来指定一个容器启动时要运行的命令。类似于 CMD 指令,但是 ENTRYPOINT 不会被 docker run 后面的命令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

执行命令

运行命令的方式

Shell 命令方式

bash
bash
RUN yum install -y vim
  • 使用 Shell 执行时,当前 shell 是父进程,生一个子 shell 进程
  • 在子 shell 中执行脚本,执行完毕后,退出子 shell,回到当前 shell
  • 子 shell 退出后,不会对父进程产生影响

Exec 命令方式

bash
bash
RUN ["yum", "install", "-y", "vim"]
  • 会用 Exec 进程替换当前进程,并保持 pid 不变
  • 执行完毕后,直接退出,并不会退回到之前的进程环境
  • 推荐使用 Exec 方式来执行命令

镜像创建时执行的命令

run

  • 在 build 构建时执行命令
  • 在构建镜像时执行的命令
  • 对镜像内部的文件或者资源进行调整,一旦镜像被创建以后,就不可以再被修改

容器创建时执行的命令

cmd

  • 容器启动后,执行默认的参数或命令
  • 用于设置默认执行的命令
  • Dockfile 中出现 多个cmd,只有 最后一个 才会被执行
  • 如果容器启动时,在启动后添加了命令,则 Dockfile 中添加的 cmd 指定会被忽略
  • 写在 Dockfile 中的 cmd 命令不一定会被执行
dockerfile
dockerfile
CMD ["ps", "-ef"]

entrypoint

  • 容器启动时执行的命令
  • Dockerfile 中只有最后一个 ENTRYPOINT 会被执行
  • ENTRYPOINT 一定会被执行,如果有多个只会执行最后一个
dockerfile
dockerfile
ENTRYPOINT ["ps"]

posted @ 2022-05-14 22:26  鱼檬檬  阅读(53)  评论(0编辑  收藏  举报