zoukankan      html  css  js  c++  java
  • Docker之dockerfile

    一、什么是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指令 

  • 相关阅读:
    2014年互联网发展趋势如何
    服务器出现阶段性错误
    用互联网思想武装自己
    杭州互联网公司汇总
    互联网牛人网址大全
    ffmpeg开发指南
    Windows下FFmpeg快速入门
    FFmpeg介绍及参数详细说明
    windows 下FFMPEG的编译方法 附2012-9-19发布的FFMPEG编译好的SDK下载
    FFMPEG视音频编解码零基础学习方法 【荐】
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4841459.html
Copyright © 2011-2022 走看看