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 $HOME RUN ["/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="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 /relativeDir ADD http://example.com/foobar / 尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据
COPY 看这个名字就知道,又是一个复制命令 语法如下: 1. COPY <src>... <dest> 2. COPY ["<src>",... "<dest>"] 与ADD的区别 COPY的<src>只能是本地文件,其他用法一致
posted on 2017-08-05 12:21 Michael2397 阅读(...) 评论(...) 编辑 收藏