复习下镜像生成途径
Dockerfile
基于容器制作
什么是dockerfile:
用来构建镜像的源码,在配置文件中调用命令,这些命令是用来生成docker镜像的。
dockerfile的语法格式:
由两类组成:
#Comment 注释信息
INSTRUCTION arguments 指令和指令参数 (指令大写为了区分参数和别的符号)
ps: 指令本身不区分大小写,然而约定俗成要大写
按顺序依次执行
第一行必须使用 FROM 指定基于哪个基础镜像来实现
因此:可以推断 所有要构建的镜像都是建立在某个已存在的某个镜像基础之上
dockerfile工作逻辑
找一个专用的目录放dockerfile文件,文件名首字母必须大写,执行的时候不能有当前文件父目录,必须基于当前目录往下走,
工作目录下也可以 创建一个.dockerfile的文件,打包是不会包含此目录下的文件。
执行方式:
docker build 执行
例如:docker build -t tinyhttpd:v1 ./
-t: 指构建后写的名字
./ : 当前的dockerfile
制作镜像时能使用的环境变量
赋值:变量名=值
引用:$变量名 或者 ${变量名}
${变量名:-word} 表示如果变量的值为空或未设置,引用后面传进来的值
${变量名:+word} 表示如果变量的值不为空,则显示后面的值
Dockerfile的指令:
FROM指定是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指定运行于次准镜像所提供的运行环境
实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker hub registry上拉取所需的镜像文件
如果找不到指定的镜像文件,docker build会返回一个错误信息
语法:
FROM <repository>[:<tag>] 或 FROM <repository>@<digest>
<repository>:指定作为base image的名称
<tag>:base image的标签,为可选项,省略表示latest
MAINAINER (这是一个可选项)
用于让Dockerfile制作人提供本人的详细信息
不限制此指令出现的位置,推荐位于FROM之后
语法:
MAINTAINER <author's detail>
<author's detail>可是任何文本信息,但约定俗成使用作者名称或邮箱
MAINTAINER "ivy" <ivy@163.com>
ps: 较新版本中已经把maintainer换成lable了,但依旧兼容
LABLE 让用户为镜像指定各种各样的元数据
语法:
LABLE <key>=<value> <key>=<value> ...
copY
语法:
copY <src>...<dest> 或
copY ["<src>",..."<dest>"]
<dest>:目标路径,即正在创建的image的文件系统路径,此处建议为绝对路径
ps:如果路径中有空白字符时,通常使用第二种格式
文件复制准则:
<src>必须是build上下文中的路径,不能是其父目录中的文件
如果<src>是目录,不用加=r选项则其内部文件或子目录会被递归复制,但自身不会被复制
如之多多个<src>,或者<src>中使用通配符,则dest必须是一个目录以/结尾
如果dest事先不存在,它将会被自动创建,包括其父目录的路径
总结:src必须使用相对路径,dest使用绝对路径
ADD
ADD指令类似于copY指令,ADD支持使用TAR文件和URL路径
语法:
ADD <src>...<dest> 或
ADD ["<src>",..."<dest>"]
操作准则:
同copY指令
如果<src>为url且<dest>不以/结尾,则<src>指定的文件讲被下载并直接被创建为<dest>,如<dest>以/结尾,则文件名url指定的文件将被直接下载并保存为<dest>/<filename>
如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,类似于"tar -x"命令,而通过url获取的tar文件讲不会自动展开
如果<src> 有多个,或去简介或直接使用通配符,则<dest> 必须以/结尾
用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、copY和ADD指定设定工作目录
语法:
workdir <dirpath>
在dockerfille文件中,workdir指定可以出现多次,其路径也可以为相对路径,不过,其实对象此前一个workdir指定的路径。
例如:
workdir /var/log
workdir $STAATEPATH
VOLUME
用于在image中创建以一个挂载点目录,以挂载Docker host 上的卷或其他容器上的卷
语法:
VOLUME <mountpoint> 或 VOLUME ["mountpoint"]
r如果挂载点目录路径下此前在文件中存在, docker run命令会在卷挂载完成后将此前所有文件复制到新挂载的卷中
EXPOSE
用于为容器打开指定要监听的端口以实现外部通信
语法:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
<protocol>用于指定传输层协议,tcp或udp 默认是tcp
EXPOAE指令可一次执行多个端口,例如:
EXPOSE 11211/udp 11211/tcp
ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指定
调用格式为$variable_name或${variable_name}
语法:
ENV <key><value>或ENV<value>=<value>
第一种格式中<key> 之后的所有内容均会视其为<value>的租车鞥部分,因此一次只能设置一个值
第二个格式可用一次设置多个变量,如果value中包含空格可用\转义,或双引号
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
语法:
RUN <command> 或 RUN ["<executable>","<param1>","<param2>"]
第一种格式中<command>通常是一个shell命令,且以"/bin/sh -c" 来运行,意味着此进程在容器中的PID不为1,不能接收Unix信号 使用docker <container> stop 来停止容器时 此进程收不到sigterm信号
第二种语法格式中的参数是一个JSON格式的数组,其中"<executable>"为要运行的命令,后面的为要传递给命令的选项值,而这种格式指定的命令不会以"/bin/sh -c" 来运行
CMD
定义一个镜像文件启动为容器时默认要运行的一个程序,可以给多个,但是只有最后一个生效
语法:
CMD <command>
CMD ["<executable>","<param1>","<pa>"]
前两种语法格式意义同RUN
第三种则用于ENTERPOINT指令提供默认参数
ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run 命令行指定的参数覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
但是docker run命令的--entrpoint选项的参数可覆盖entrypoint指令指定的程序
语法:
ENTRYPOINT <COMMAND>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run 命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅最后一个生效
USER
用于指定运行image时或运行dockerfile中任何RUN、CMD或entrypoint指令指定的程序时的用户UID
语法:
USER <UID> | <UserName>
<UID>可以是任意数字,但实践中其必须为/etc/paword中某个用户的有效UID,否则docker run命令将运行失败
HEALTHCHECH
详情待补充
SHELL
STOPSIGNAL
ARG
ONBUILD:
用于在Dockerfile中定义一个触发器,
执行时间:
做成镜像以后别人用此镜像作为基础镜像的时候才会执行