首页 > 代码库 > dockerfile创建镜像

dockerfile创建镜像

dockerfile用来快速创建自定义镜像

基本结构

dockerfile分为部分:基础镜像信息,维护者信息,镜像操作指令,容器启动时执行指令

一开始必须指明所基于的镜像名称-》维护者信息-》镜像操作指令(RUN)->运行容器时的操作命令(CMD)

指令说明

FROM 功能为指定基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为:FROM scratch。同时意味着接下来所写的指令将作为镜像的第一层开始 语法:FROM <image>FROM <image>:<tag>FROM <image>:<digest> 三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
RUN 功能为运行指定的命令RUN命令有两种格式1. RUN <command>2. RUN ["executable", "param1", "param2"]第一种后边直接跟shell命令在linux操作系统上默认 /bin/sh -c在windows操作系统上默认 cmd /S /C第二种是类似于函数调用。可将executable理解成为可执行文件,后面就是两个参数。每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像两种写法比对:RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOMERUN ["/bin/bash", "-c", "echo hello"]注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。RUN书写时的换行符是\
CMD 功能为容器启动时要运行的命令语法有三种写法1. CMD ["executable","param1","param2"]2. CMD ["param1","param2"]3. CMD command param1 param2第三种比较好理解了,就时shell这种执行方式和写法第一种和第二种其实都是可执行文件加上参数的形式 举例说明两种写法:CMD [ "sh", "-c", "echo $HOME" CMD [ "echo", "$HOME" ]补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。原因是参数传递后,docker解析的是一个JSON array

每个Dockerfile只能有一个CMD命令。如果指定了多条指令,只有最后一条会被执行
如果用户启动容器时手动指定了运行的命令(作为run的参数),则会覆盖掉CMD指定的命令

LABEL功能是为镜像指定标签 语法:LABEL <key>=<value> <key>=<value> <key>=<value> ... 一个Dockerfile种可以有多个LABEL,如下:LABEL "com.example.vendor"="ACME Incorporated"LABEL com.example.label-with-value="http://www.mamicode.com/foo"LABEL version="1.0"LABEL description="This text illustrates that label-values can span multiple lines."
说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖
MAINTAINER指定作者语法:MAINTAINER <name>
EXPOSE功能为暴漏容器运行时的监听端口给外部但是EXPOSE只是启动声明作用,并不会使容器访问主机的端口如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
ENV功能为设置环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在语法有两种1. ENV <key> <value>2. ENV <key>=<value> ...两者的区别就是第一种是一次设置一个,第二种是一次设置多个

ADD
一个复制命令,把文件复制到景象中。如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。 语法如下:1. ADD <src>... <dest>2. ADD ["<src>",... "<dest>"] <dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径<src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url 如果把<src>写成一个url,那么ADD就类似于wget命令 如以下写法都是可以的:ADD test relativeDir/ ADD test /relativeDirADD http://example.com/foobar /尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据
COPY看这个名字就知道,又是一个复制命令语法如下:1. COPY <src>... <dest>2. COPY ["<src>",... "<dest>"]与ADD的区别COPY的<src>只能是本地文件,其他用法一致

 

dockerfile创建镜像