dockerfile建立镜像

dockerfile用来快速建立自定义镜像linux

基本结构

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

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

指令说明

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>只能是本地文件,其余用法一致
相关文章
相关标签/搜索