dockerfile构建镜像
镜像是多层存储,每一层在前一层的基础上进行修改;
容器也是多层存储,以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
要求
1.docker会逐行读取dockerfile中每一行的指令,按顺序解析,实现images的自动构建
2.通过docker build命令构建镜像
3.dockerfile只认识自己规定的指令,不支持自定义
4.大小写不明感,但是建议指令用纯大写
docker指令
FROM
FROM base镜像
必须在dockerfile第一行,表示从哪个基础镜像构建
MAINTAINER
MAINTAINER
可选,填入作者信息,如 MAINTAINER Denlin
RUN
# 用法
RUN
每一个RUN指令都是单独开启一个镜像层(镜像优化里需要关注)
可以写入多个RUN,自上而下执行RUN命令
语法一
RUN <cmd> 会被当做 /bin/sh -c "cmd" 执行方式
语法二
RUN ["命令","参数1","参数2"] docker会将其解析为json,因此必须是双引号,且命令必须是绝对路径
# 原理
RUN后面的命令,每一个RUN本质上就是开启一个容器,执行命令,然后提交执行结果加入为新的一层镜像记录。
前一个RUN的执行结果,仅仅是针对当前进程,在内存中产生的数据变化;
后一个RUN的执行,会产生新的容器,和第一个RUN容器没有任何关系,也不会继承前一层构建产生的内存变化。
如果你要并联执行2个命令,可以用 如 cd /opt && echo "hello,denlin"
CMD
CMD
- CMD是专门用于容器运行时候的默认命令;
- 当容器运行时,你也可以在命令结尾 主动添加 command,就会覆盖dockerfile构建的镜像中的默认cmd;
- dockerfile里只能写一个CMD,即使写多个,只有最后一个CMD生效;
- CMD定义语法
CMD <cmd> 以/bin/sh -c "cmd"执行
CMD <"executable","args1","args2">
CMD ["arg1","arg2"] 这里要注意,ENTRYPOINT的参数了
参考用法
CMD ["nginx", "-g", "daemon off;"]
EXPOSE
EXPOSE
声明容器暴露端口;
语法:EXPOSE <port1> <port2>
EXPOSE只是声明容器运行时,提供哪个对外的服务端口,并不会自己开启,需要主动用参数映射;
-p <宿主机端口>:<容器端口>
- 作用1是帮助运维理解这个镜像所开启的端口,便于配置映射关系
- 作用2是,使用随机映射的话,也会使用EXPOSE打开的端口
ENTRYPOINT
ENTRYPOINT
- 翻译为入口点,可以理解为,将最终的容器变成一个可执行的文件,
- ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。
- ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
- 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
- 换句话说实际执行时,将变为:
<ENTRYPOINT> "<CMD>"
ADD和COPY
注意
在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。 另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。 因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。 在使用该指令的时候还可以加上--chown=
: 选项来改变文件的所属用户及所属组
1.如源码编译下这个需求,可以用ADD,COPY将宿主机上的文件,复制到镜像里
2.DD和COPY的源路径,必须是以dockerfile所在目录的相对路径
3.原路径也可以是一个网络URL
4.ADD比COPY多一个解压tar的功能。
ENV
格式有两种:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
这个指令很简单,就是设置环境变量而已
无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
基于该镜像运行容器,自动拥有该环境变量,常用于设置如数据库等配置信息
WORKDIR
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
USER
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份
VOLUME
用来创建一个在镜像以外的挂载点,用于在多个容器之间共享数据
格式为:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
标签:容器,RUN,CMD,指令,构建,镜像,dockerfile
From: https://www.cnblogs.com/ctynlnlnl/p/18281938