Docker入门4------Dockerfile

转自:http://www.javashuo.com/article/p-rkleewlt-hb.html
http://www.javashuo.com/article/p-hpldenwl-hr.htmlhtml

Docker经过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建
  经过使用build命令,根据Dockerfiel的描述来构建镜像
  经过源代码路径的方式
  经过标准输入流的方式docker

经过源代码路径
  Dockerfile须要放置在项目的根目录位置
  在构建的时候,Dockerfile client会把整个context打包发送到Docker Server端,而后由server端负责build镜像,在构建成功后,会删除context目录
  docker build -t {镜像名字} {项目路径能够是相对路径}
  docker利用Dockerfile来构建新镜像以前,先来了解一下Dockerfile建立中使用到的指令json

经过标准输入流:bash

  经过标准输入流的方式获取Dockerfile的内容
  client不会打包上传context目录,所以对于一些ADD、COPY等涉及host本地文件复制的操做不可以支持
  docker build -t {镜像名字} - < Dockerfile路径网络

build cache:
  Dockerfile中的每个指令执行完毕后,都会提交为一个image,这样保证了指令之间不会有影响
  Dockerfile会尽量尝试重用以前已经构建的镜像
  能够经过在build命令中增长--no-cache的方式来禁用这个cacheui

Dockerfile指令:
  只支持Docker本身定义的一套指令,不支持自定义
  大小写不敏感,可是建议所有使用大写
  根据Dockerfile的内容顺序执行server

FROM:
  FROM {base镜像}
  必须放在DOckerfile的第一行,表示从哪一个baseimage开始构建htm

MAINTAINER:
  可选的,用来标识image做者的地方blog

RUN:
  每个RUN指令都会是在一个新的container里面运行,并提交为一个image做为下一个RUN的base
  一个Dockerfile中能够包含多个RUN,按定义顺序执行
  RUN支持两种运行方式:
    RUN 这个会看成/bin/sh -c “cmd” 运行
    RUN [“executable”,“arg1”,。。],Docker把他看成json的顺序来解析,所以必须使用双引号,并且executable须要是完整路径
继承

  RUN 都是启动一个容器、执行命令、而后提交存储层文件变动。第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会形成任何文件。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更彻底不要紧,天然不可能继承前一层构建过程当中的内存变化。而若是须要将两条命令或者多条命令联合起来执行须要加上&&。如:cd /usr/local/src && wget xxxxxxx

CMD:
  CMD的做用是做为执行container时候的默认行为(容器默认的启动命令)
  当运行container的时候声明了command,则再也不用image中的CMD默认所定义的命令
  一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起做用

CMD定义的三种方式:
  CMD 这个会看成/bin/sh -c "cmd"来执行
  CMD ["executable","arg1",....]
  CMD ["arg1","arg2"],这个时候CMD做为ENTRYPOINT的参数

EXPOSE 声明端口
  格式为 EXPOSE <端口1> [ <端口2> ...]。

  EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会由于这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另外一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

entrypoint:
  entrypoint的做用是,把整个container变成了一个可执行的文件,这样不可以经过替换CMD的方法来改变建立container的方式。可是能够经过参数传递的方法影响到container内部
  每一个Dockerfile只可以包含一个entrypoint,多个entrypoint只有最后一个有效
  当定义了entrypoint之后,CMD只可以做为参数进行传递

entrypoint定义方式:
  entrypoint ["executable","arg1","arg2"],这种定义方式下,CMD能够经过json的方式来定义entrypoint的参数,能够经过在运行container的时候经过指定command的方式传递参数
  entrypoint ,看成/bin/bash -c "cmd"运行命令

ADD & COPY:
  当在源代码构建的方式下,能够经过ADD和COPY的方式,把host上的文件或者目录复制到image中
  ADD和COPY的源必须在context路径下
  当src为网络URL的状况下,ADD指令能够把它下载到dest的指定位置,这个在任何build的方式下均可以work
  ADD相对COPY还有一个多的功能,可以进行自动解压压缩包

ENV:
  ENV key value
  用来设置环境变量,后续的RUN可使用它所建立的环境变量
  当建立基于该镜像的container的时候,会自动拥有设置的环境变量

WORKDIR:
  用来指定当前工做目录(或者称为当前目录)
  当使用相对目录的状况下,采用上一个WORKDIR指定的目录做为基准

USER:
  指定UID或者username,来决定运行RUN指令的用户

ONBUILD:
  ONBUILD做为一个trigger的标记,能够用来trigger任何Dockerfile中的指令
  能够定义多个ONBUILD指令
  当下一个镜像B使用镜像A做为base的时候,在FROM A指令前,会先按照顺序执行在构建A时候定义的ONBUILD指令
  ONBUILD

VOLUME:   用来建立一个在image以外的mount point,用来在多个container之间实现数据共享   运行使用json array的方式定义多个volume   VOLUME ["/var/data1","/var/data2"]   或者plain text的状况下定义多个VOLUME指令

相关文章
相关标签/搜索