一、什么是dockerfile

  Docker通过对于在dockerfile中的一系列指令的顺序解析实现自动的Image的构建;

  通过使用build命令,根据dockerfile的描述来构建镜像;

  build的两种方法:

    • 通过源代码路径的方式;
    • 通过标准输入流的方式;

  通过源代码路径:

    • Dockerfile需要放置在项目的根目录位置;
    • 在构建的时候,Docker client会把整个Context打包发送到docker Server端,然后由Server端负责build镜像,在构建成功后,会删除Context目录;
    • docker build -t {镜像名字}{项目的路径,可以是相对路径}

  通过标准输入流:

    • 通过标准输入流的方式获取dockerfile的内容;
    • client不会打包上传context目录,因此对于一些ADD、COPY等涉及HOST本地文件复制的操作不能够支持;
    • docker  build -t  {镜像名字} -< Dockerfile路径 

  build cache:

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

  dockerignore:

    当选择用源代码路径的方式构建image的时候,通过在根目录下放置.dockerignore文件,来过滤不需要发送到server端的文件

    类似于.gitinore的概念

二、Dockerfile指令: 

  • 只支持docker自己定义的一套指令,不支持自定义
  • 大小写不敏感,但是建议全部使用大写
  • 根据dockerfile的内容顺序执行

  FROM

    FROM {base镜像}

    必须放在dockerfile的第一行,表示从哪个BaseImage开始构建

  MAINTAINER

    可选的,用来标示Image作者的地方

  RUN

    每一个RUN指令都会是在一个新的container里面运行,并提交为一个Image作为下一个RUN的base

    一个dockerfile中可以包含多个RUN,按定义顺序执行

    RUN支持两种运行方式:

      RUN <cmd>  这个会当作/bin/sh  -c  "cmd"运行

      RUN ["executable", "arg1", ....], docker把它当Json的序列来解析,因此必须用双引号,而且executable需要是完整路径;

  CMD

    CMD的作用是作为执行Container时候的默认行为

    当运行Container的时候声明了Command,则不再使用Image中的CMD所定义的命令;

    一个dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用;

    CMD定义三种方式:

    1. CMD <cmd> 这个会当作/bin/sh -c  "cmd"来执行
    2. CMD ["executable", "arg1", "arg2"]
    3. CMD ["arg1", "arg2"], 这个时候CMD作为ENTRYPOINT的参数;        

  ENTRYPOINT:

    ENTPYPOINT的作用是,把整个Container变成了一个可执行文件,这样不能够通过替换CMD的方法来改变创建Container的方式。但是可以通过参数传递的方式影响到Container内部。

    每个Dockerfile只能包含一个ENTRYPOINT,多个ENTRYPOINT只有最后一个能有效;

    当定义了ENTRYPOINT以后,CMD只能作为参数进行传递;

    ENTRYPOINT定义方式:

      ENTPYPOINT ["executable", "arg1", "arg2"], 这种定义方式下,CMD可以通过Json序列的方式来定义ENTRYPOINT的参数,可以通过在运行Container的时候通过指定Command的方式传递参数

      ENTRYPOINT <cmd>, 当做/bin/sh -c  "cmd"运行;

    ADD&COPY:

      当在源代码构建的方式下,可以通过ADD和COPY的方式,把Host上的文件或者目录复制到Image

      ADD&COPY的源必须在context路径下;

      当src为网络URL的情况下,ADD指令可以把它下载到Dest的指定位置,这个在任何build的方式下都可以工作;

    ENV:

      用来设置环境变量,后续的RUN可以使用它所创建的环境变量;

      当创建基于该镜像的Container的时候,会自动拥有设置的环境变量;

    WORKDIR:

      用来指定当前工作目录

      当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准;

   USER:

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

   ONBUILD:

      ONBUILD作为一个trigger的标记,可以用来trigger任何Dockerfile中的指令;

      可以定义多个ONBUILD指令

      当下一个镜像B使用镜像A作为Base的时候,在FROM A指令前,会按照顺序执行在构建A时候定义的ONBUILD指令

      ONBUILD <DOCKERFILE指令> <Content>

   VOLUME:

      用来创建一个在Image之外的mount  point,用来在多个container之间实现数据共享

      运行使用json array的方式定义多个volume

      VOLUME ["/var/data1",  "/var/data2/"]

        或则plain  text的情况下定义多个VOLUME指令

Docker之dockerfile的更多相关文章

  1. Centos7安装Docker 基于Dockerfile 搭建httpd运行环境

    Centos7安装Docker 基于Dockerfile 搭建httpd运行环境 docker docker搭建 docker build 本文档完成目标内容如下 使用Docker搭建http服务器一 ...

  2. docker 13 dockerfile的保留字指令

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤:1.编写dockerfile文件:2.docker build:3.docker run doc ...

  3. docker:Dockerfile构建LNMP平台

    docker:Dockerfile构建LNMP平台   1.dockerfile介绍  Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...

  4. docker之Dockerfile指令介绍

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

  5. Docker、Dockerfile、Docker镜像、容器这些都是什么鸟?

    老生常谈,再再再……普及一下: Docker:最早是dotCloud公司出品的一套容器管理工具,但后来Docker慢慢火起来了,连公司名字都从dotCloud改成Docker. Dockerfile: ...

  6. Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...

  7. (转)Docker 基础 : Dockerfile

    全文来自 Docker 基础 : Dockerfile Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像.我们会先介绍 Dockerfile 的 ...

  8. 【docker】Dockerfile

    [docker]Dockerfile 转载: ============================================================= =============== ...

  9. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  10. docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像

    docker通过dockerfile构建JDK最小镜像,Docker导出导入镜像 一.docker通过dockerfile构建JDK最小镜像 1.1 下载JRE 1.2 解压JRE,删除相关不需要文件 ...

随机推荐

  1. 发送邮件java实现

    下面代码可以实现普通qq邮箱发送邮件的功能,可以传附件,但是是固定的附件: 需要两个jar包:mail.jar,activation.jar mail.jar 下载地址: http://java.su ...

  2. TLC是什么

    TLC = Triple-Level Cell,即3bit/cell,它的寿命短,速度慢,约500-5000次擦写寿命. 现在U盘多为MLC,TLC也有一部分,将来TLC会占大部分市场. 一种名为TL ...

  3. 以程序的方式操纵NTFS的文件权限

    Windows NT/2K/XP版本的操作系统都支持NTFS格式的文件系统,这是一个有安全性质的文件系统,你可以通过Windows的资源管理器来设置对每个目录和 文件的用户访问权限.这里我就不对NTF ...

  4. Android手势源码浅析-----手势绘制(GestureOverlayView)

    Android手势源码浅析-----手势绘制(GestureOverlayView)

  5. 如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true

    下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:“如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true”,于是LZ做了下面的这样的程序: bool ...

  6. Android之条码扫描二维码扫描

    Android之条码扫描二维码扫描 二维码条形码扫描,参考技术网址: 1.Apache License 2.0 开源的ZXing项目的简化版 http://xinlanzero.iteye.com/b ...

  7. linux 自旋锁

    一.概述: 自旋锁是SMP架构中的一种low-level的同步机制.当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了.对于自选锁需要注意: 由于自 ...

  8. openstack之nova启动实例过程

    概述: 启动一个实例包含以下步骤: API server:处理用户请求并转发至cloud controller cloud controller:处理计算节点.网络控制.api server 以及sc ...

  9. mockjax MOCK.js的拦截ajax请求

    今天看了下 mock.js的拦截请求 .https://github.com/nuysoft/Mock/blob/master/src/mockjax.js //覆盖(拦截) Ajax 请求,目前内置 ...

  10. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...