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"]
我常常觉得我在为一个没时间享受的人生奋斗,我希望它能有价值