复习下镜像生成途径

   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. ubuntu 命令行以及目录的显示改为英文

    在安装ubuntu的时候原本以为把ubuntu改为中文的好理解一些,最后发现命令行的报错一边中文一边英文确实难受,也不宜于学习,所以想把命令行以及目录的显示都改为英文的,我是这样先把命令行的该为英文的 ...

  2. 关于axios如何在请求头添加参数

    vm.$http.post(apiUrl.refundOrder, data,{ headers:{ 'lz-shopid':vm.orderRecords.shopId } }).then(res ...

  3. MLN Alchemy

    1. 前言: 本文主要参考Alchemy Tutorial, washington主页上挂出的所有Alchemy项目(包括Alchemy1.0, Alchemy2.0, AlchemyLite)都无法 ...

  4. Scala使用备注一

    package com.ws.spark.study.scala import java.io.File import org.scalatest.FlatSpec import scala.io.S ...

  5. 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

  6. 数字麦克风PDM信号采集与STM32 I2S接口应用--笔记目录

    数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...

  7. [Agc029B]Powers of two_贪心_树形dp

    Powers of two 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_b 数据范围:略. 题解: 可能一点思路都没有. 但是我们发现:如 ...

  8. macos 更改罗技k810无线键盘的映射

    在mac系统中,command键非常关键,但k810接入后, win键被映射为Command,而Alt的位置却是mac内置键盘的Command的位置. 为方便使用,可以把Win键和Alt键做一个对换. ...

  9. Android 变量取名神器

    前言 在工作中,我们还在为起变量名而苦恼吗?今天无意间发现一个专门为变量取名而诞生的神器 codelf. 我们可以直接浏览器访问 http://unbug.github.io/codelf/ 现在我们 ...

  10. windows 清理 cbs.log 文件

    请参考以下步骤 1.win+r输入 services.msc进入服务,找到并双击Windows Modules Installer点击停止, 2.然后就可以手动删除 3.按一的步骤开启TrustedI ...