复习下镜像生成途径

   Dockerfile

   基于容器制作

什么是dockerfile:

  用来构建镜像的源码,在配置文件中调用命令,这些命令是用来生成docker镜像的。

dockerfile的语法格式:

  由两类组成:

    #Comment 注释信息

    INSTRUCTION arguments    指令和指令参数 (指令大写为了区分参数和别的符号)

    ps: 指令本身不区分大小写,然而约定俗成要大写

      按顺序依次执行

      第一行必须使用 FROM 指定基于哪个基础镜像来实现

      因此:可以推断 所有要构建的镜像都是建立在某个已存在的某个镜像基础之上

dockerfile工作逻辑

  找一个专用的目录放dockerfile文件,文件名首字母必须大写,执行的时候不能有当前文件父目录,必须基于当前目录往下走,

  工作目录下也可以 创建一个.dockerfile的文件,打包是不会包含此目录下的文件。 

执行方式:

  docker build 执行 

  例如:docker build -t tinyhttpd:v1 ./

  -t: 指构建后写的名字

  ./ : 当前的dockerfile

制作镜像时能使用的环境变量

  赋值:变量名=值

  引用:$变量名  或者 ${变量名}

  ${变量名:-word}  表示如果变量的值为空或未设置,引用后面传进来的值

  ${变量名:+word} 表示如果变量的值不为空,则显示后面的值

Dockerfile的指令:

  FROM指定是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指定运行于次准镜像所提供的运行环境

  实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机上查找指定的镜像文件,在其不存在时,则会从Docker hub registry上拉取所需的镜像文件

  如果找不到指定的镜像文件,docker build会返回一个错误信息

  语法:

    FROM <repository>[:<tag>] 或 FROM <repository>@<digest>

      <repository>:指定作为base image的名称

      <tag>:base image的标签,为可选项,省略表示latest

  

  MAINAINER (这是一个可选项)

    用于让Dockerfile制作人提供本人的详细信息

    不限制此指令出现的位置,推荐位于FROM之后

    语法:

      MAINTAINER <author's detail>

        <author's detail>可是任何文本信息,但约定俗成使用作者名称或邮箱

        MAINTAINER "ivy" <ivy@163.com>

    ps: 较新版本中已经把maintainer换成lable了,但依旧兼容

  LABLE 让用户为镜像指定各种各样的元数据

    语法:

      LABLE <key>=<value>  <key>=<value> ...

  COPY

    用于从Docker主机复制文件到创建的映像文件系统中

    语法:

      COPY <src>...<dest> 或

      COPY ["<src>",..."<dest>"]

         <src>: 要复制的源文件目录,支持使用通配符

        <dest>:目标路径,即正在创建的image的文件系统路径,此处建议为绝对路径

        ps:如果路径中有空白字符时,通常使用第二种格式

    文件复制准则:

      <src>必须是build上下文中的路径,不能是其父目录中的文件

      如果<src>是目录,不用加=r选项则其内部文件或子目录会被递归复制,但自身不会被复制

      如之多多个<src>,或者<src>中使用通配符,则dest必须是一个目录以/结尾

      如果dest事先不存在,它将会被自动创建,包括其父目录的路径

      总结:src必须使用相对路径,dest使用绝对路径

  ADD

    ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

    语法:

      ADD <src>...<dest> 或

      ADD ["<src>",..."<dest>"]

    操作准则:

      同COPY指令

      如果<src>为url且<dest>不以/结尾,则<src>指定的文件讲被下载并直接被创建为<dest>,如<dest>以/结尾,则文件名url指定的文件将被直接下载并保存为<dest>/<filename>

          如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,类似于"tar -x"命令,而通过url获取的tar文件讲不会自动展开

      如果<src> 有多个,或去简介或直接使用通配符,则<dest> 必须以/结尾

  WORKDIR

    用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录

    语法:

      WORKDIR <dirpath>

        在dockerfille文件中,WORKDIR指定可以出现多次,其路径也可以为相对路径,不过,其实对象此前一个WORKDIR指定的路径。

        另外,WORKDIR也可调用由ENV指定定义的变量

    例如:

      WORKDIR /var/log

      WORKDIR $STAATEPATH

  VOLUME

    用于在image中创建以一个挂载点目录,以挂载Docker host 上的卷或其他容器上的卷

    语法:

      VOLUME  <mountpoint> 或 VOLUME ["mountpoint"]

    r如果挂载点目录路径下此前在文件中存在, docker run命令会在卷挂载完成后将此前所有文件复制到新挂载的卷中

    

  EXPOSE

    用于为容器打开指定要监听的端口以实现外部通信

    语法:

      EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]

      <protocol>用于指定传输层协议,tcp或udp 默认是tcp

    EXPOAE指令可一次执行多个端口,例如:

      EXPOSE 11211/udp 11211/tcp

  ENV

    用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指定

      (如ENV、ADD、COPY)锁调用

    调用格式为$variable_name或${variable_name}

    语法:

      ENV <key><value>或ENV<value>=<value>

    第一种格式中<key> 之后的所有内容均会视其为<value>的租车鞥部分,因此一次只能设置一个值

    第二个格式可用一次设置多个变量,如果value中包含空格可用\转义,或双引号

  RUN

    用于指定docker build过程中运行的程序,其可以是任何命令

    语法:

      RUN <command> 或 RUN ["<executable>","<param1>","<param2>"]

    第一种格式中<command>通常是一个shell命令,且以"/bin/sh -c" 来运行,意味着此进程在容器中的PID不为1,不能接收Unix信号 使用docker <container> stop 来停止容器时 此进程收不到sigterm信号

    第二种语法格式中的参数是一个JSON格式的数组,其中"<executable>"为要运行的命令,后面的为要传递给命令的选项值,而这种格式指定的命令不会以"/bin/sh -c" 来运行

  CMD

    定义一个镜像文件启动为容器时默认要运行的一个程序,可以给多个,但是只有最后一个生效

  语法:

    CMD <command>

    CMD ["<executable>","<param1>","<pa>"]

    CMD ["<param1>","<param2>"]

  前两种语法格式意义同RUN

  第三种则用于ENTERPOINT指令提供默认参数

  ENTRYPOINT

    类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序

    与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run 命令行指定的参数覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序

      但是docker run命令的--entrpoint选项的参数可覆盖entrypoint指令指定的程序

    语法:

      ENTRYPOINT <COMMAND>

      ENTRYPOINT ["<executable>","<param1>","<param2>"]

    docker run 命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用

    Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅最后一个生效

  USER

    用于指定运行image时或运行dockerfile中任何RUN、CMD或entrypoint指令指定的程序时的用户UID

    默认情况下container的运行身份为root用户

    语法:

      USER <UID> | <UserName>

      <UID>可以是任意数字,但实践中其必须为/etc/paword中某个用户的有效UID,否则docker run命令将运行失败

  HEALTHCHECH

    详情待补充

  SHELL

  STOPSIGNAL

  ARG

  ONBUILD:

    用于在Dockerfile中定义一个触发器,

    执行时间:

      做成镜像以后别人用此镜像作为基础镜像的时候才会执行

docker 第六篇 dockerfile的更多相关文章

  1. docker 实践六:dockerfile 详解

    本篇开始来学习关于 dockerfile 的知识. 注:环境为 CentOS7,docker 19.03. dockerfile 是⼀个⽂本格式的配置⽂件, ⽤户可以使⽤ dockerfile 来快速 ...

  2. Docker学习(六)Dockerfile构建自定义镜像

    Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...

  3. Docker学习(六)——Dockerfile文件详解

    Docker学习(六)--Dockerfile文件详解 一.环境介绍 1.Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录 ...

  4. docker+k8s基础篇一

    Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...

  5. 小白学Docker之基础篇

    系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记总结 1. docker是什么 百科上的 ...

  6. Docker之基础篇

    小白学Docker之基础篇   系列文章: 小白学Docker之基础篇 小白学Docker之Compose 小白学Docker之Swarm PS: 以下是个人作为新手小白学习docker的笔记总结 1 ...

  7. Docker容器网络篇

    Docker容器网络篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker的网络模型概述 如上图所示,Docker有四种网络模型: 封闭式网络(Closed conta ...

  8. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  9. Docker实战 | 第二篇:IDEA集成Docker插件实现一键自动打包部署微服务项目,一劳永逸的技术手段值得一试

    一. 前言 大家在自己玩微服务项目的时候,动辄十几个服务,每次修改逐一部署繁琐不说也会浪费越来越多时间,所以本篇整理通过一次性配置实现一键部署微服务,实现真正所谓的一劳永逸. 二. 配置服务器 1. ...

随机推荐

  1. Socket概述

    Socket套接字概述: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信. 数据在两个Socket ...

  2. Objective-C中的一些方法命名“潜规则”

    在基于Apple Xcode的Objective-C中,有一些方法命名潜规则,比如就property而言,假定你定义了如下property: @interface MyObject @property ...

  3. CSS3常用属性及效果汇总

    本文转载于<https://blog.csdn.net/lyznice/article/details/54575905> 一.2D效果属性 要使用这些属性,我们需要通过 transfor ...

  4. Linux 远程登陆图形界面

    如果我的解决方案帮助到了你,请随手点亮一颗小红心.如有疑问,可在下方评论区处留言. 利用Xmanager,linux启用XDMCP协议(可直接修改配置文件,也可以采用在Xshell中运行gdmconf ...

  5. maven编译正常,运行报错:中没有主清单属性

    在pom.xml添加插件 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId&g ...

  6. Elasticsearch删除数据操作,你必须知道的一些坑

    前两天有同事打电话问我,说ES删除数据有没有什么坑? 我当时就问,是删索引还是删索引里的数据?她回答说是删数据,我说查出这些数据直接删除就好了,没有什么坑... 后来想想,关于ES数据的删除,之前确实 ...

  7. iOS开发需要安装的工作软件

    1 源代码管理工具 SVN:SVN可以使用的客户端软件有Cornerstone,SmartSVN,svnX,乌龟SVN,莲花版svn等 或者git(sourcetree) 2 有道词典 3 Foxma ...

  8. Linux nginx 会话保持(session)

    nginx 会话保持(session)有2种算法,一种是自带IP HASH 算法,一种是基于第三方模块sticky模块来实现会话保持 1)ip_hash 简单易用,但是有如下缺点 后端服务器宕机后,s ...

  9. 用JavaScript来实现单例模式

    首先,了解一下什么是单例模式,这里我直接把菜鸟教程中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  10. 记录编译<Separable Subsurface Scattering demo>工程遇到的问题

    1. Separable Subsurface Scattering demo 可以从 https://github.com/iryoku/separable-sss 下载下来,但是默认的sln 是 ...