1.dockerfile
镜像的定制实际上就是定制每一层所添加的配置和文件。如果可以把每一层修改、安装、构建、操作的命令都可以写到一个脚本中,用这个脚本来构建、定制镜像,并且重复利用、镜像的构建透明化、体积的优化,那这个脚本称之为dockerfile。
2.为什么使用dockerfile
目前的仓库镜像很难找到一个满足项目需求、非常好用的镜像,就需要自定义镜像
3.dockerfile语法
基本指令有13个
FROM
MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTERYPOINT
VOLUVE
USER
WOPKDIR
ONBUILD
3.1FROM
用法:FROM<image>
说明:dockerfile第一个指令必须是FROM其制定一个构建镜像的基本源镜像,如果本地docker镜像没有会从公共库中拉去pull。没有指定镜像的Tag则会使用默认的latest标签tag,可以出现很多次,如果现在同一个dockerfile中构建多个镜像
3.2 MAINTAINER
用法:MAINTAINER<author><email>
说明:描述镜像的创建者的名称和邮箱
3.3RUN
用法:RUN”command””param1””param2””…”
说明:RUN命令是执行之后会生成一个新的镜像。也可以是镜像的分层构建。一句RUN就是一个分层,相当于一个版本。RUN后面的都需要使用双引号不能用单引号,也可以不写?
3.4CMD
用法:CMD[“command”,”param1”,”param2”,”…”]
说明:CMD命令在dockerfile中只能出现一次,如果又多次,则只有最后一次生成。
3.5EXPOSE
用法:EXPOSEport1port2…
说明:设置容器对外映射的容器端口号,在docker run -p 的时候生效。
3.6ENV
用法:ENV
说明: ENV指令用以定义镜像的环境变量,定义环境变量的同时,可以引用已经定义的环境变量
3.7ADD
用法:ADD<src><dest>
说明:复制宿主机本地文件或者目录或者远程文件,添加到指定的容器的目录,支持正则。路径是绝对路径,不存在自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的文件夹自动解压
3.8COPY
用法:COPY<src><dest>
Src表示源 宿主机上的源,源代表着文件或者文件目录
Dest表示 容器中的指定目录
说明:COPY除了不能自动解压,也不能复制网络文件。其他功能和ADD相同
3.9ENTERYPOINT
用法:ENTERYPOINT”command””pararm1””pararm2””…”
说明:和CMD一样,唯一的区别是不能被docker run 命令的执行命令覆盖,如果想覆盖则需要带上 –entrypoint,如果是多项最后一个有效
3.10VOLUME
用法:VOLUME[“path”]
说明:宿主机上创建一个挂载,挂载到容器的指定路径,docker run -v 命令也能实现挂载,而且更强大。这个命令不能指定宿主机的需要挂载到容器的文件目录的路径,但是docker -v可以,而且docker -v 也可以挂载数据容器
3.11USER
用法:USER <user>[:<group>] or
USER <UID>[:<GID>]
说明:指定运行时的用户名或UID,后续的RUN也会使用指定的用户。当服务不需要管理权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。要临时获取管理权限可以使用gosu,而不推荐sudo
3.12WORKDIR
用法:WORKDIR path
说明:为RUN,COPY,ENTRYPOINT 指定配置工作目录,可以使用多个WORKDIR后续参数如果是相对路径,则会基于之前的命令指定的路径。比如:WORKDIR/Home WORKDIR test 最终的路径为/Home/test
如果设置对了环境变量 例如当前的环境变量
3.13 ONBUILD
说明:ONBUILD指令可以为镜像添加触发。当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。
需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。