Dockfile介绍

从上到下依次执行 每次执行一条指令就创建一个镜像层

第一条指令必须是FROM    表示需要构建的镜像是由哪个镜像为基础镜像   后续的指令运行于此基准镜像所提供的运行环境

可以设置 .dockeringore 指定不打包进镜像的文件列表

在docker build中执行的shell命令环境是由基础镜像所包含的命令集合

${ varriable:-default }  如果变量未设置值,则给变量赋一个默认值   ${ variable: +default } 如果已经给变量设置过值,则用default代替变量的值

COPY指令

从dockerfile的工作目录中 复制指定文件到目标镜像的文件系统中

COPY <src> ... <dest>

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

<dest>:目标路径,即正在创建的image的文件系统路径;建议为<dest>使用绝对路径   否则,COPY指定则以WORKDIR为其起始路径.

注意:  在路径中有空白字符时,通常使用第二种格式

复制规则:

src的路径不能是当前工作目录之上的目录或者文件 只能是工作目录中的文件或者子目录

如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制  相当于shell中的 cp  -r  /root/dir/*    /tmp

如果指定了多个<src>或在<src>中使用了通配符  则<dest>必须是一个目录,且必须以/结尾

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

ADD指令

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

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

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

如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结 尾的目录路径;如果<dest>不以/结尾,则其被视作一个普通文件,<src>的内 容将被直接写入到<dest>

WORKDIR指令

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

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

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

VOLUME指令

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

VOLUME <mountpoint> 或   VOLUME ["<mountpoint>"]

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

不能指定宿主机上面的目录路径  只能创建docker manage volume

EXPOSE指令

用于为容器打开指定要监听的端口以实现与外部通信   动态绑定到宿主机的随机端口  不能指定宿主机上的端口

EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]   EXPOSE指令可一次指定多个端口  EXPOSE 11211/udp 11211/tcp

EXPOSE 只是表示当前镜像在运行为容器的时候可以暴露指定的端口,但是需要在run的时候配合 -P 选项 否则即使在Dockerfile中

通过EXPOSE指定的端口在容器运行的时候默认还是不会被暴露的   EXPOSE 一定需要配合 -P 选项 才能发挥作用

ENV指令

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用

ENV <key> <value>

ENV <key>=<value> ...

第二种格式可用一次设置多个变量,每个变量为一个"<key>=<value>"的 键值对.如果<value>中包含空格,可以以反斜线(\)进行转义,也可通过对<value>加引号进行标识.另外,反斜线也可用于续行

在docker run的时候可以通过 -e 选项直接覆盖Dockerfile文件中已经指定的ENV或者添加为容器新的ENV变量的

RUN指令

用于指定docker build过程中运行的程序      其可以是任何命令  但是需要基础镜像的shell环境的支持

可以出现多次RUN指令

RUN <command>       以shell的子进程运行

<command>通常是一个shell命令,且以“/bin/sh -c”来运行它, 这意味着此进程在容器中的PID不为1,不能接收Unix信号.因此,当使用 docker stop <container>命令停止容器时,此进程接收不到SIGTERM信号;能够接收信号的进程一般是进程号为1的进程.

RUN ["<executable>", "<param1>", "<param2>"]      直接由内核创建运行进程 可处理系统发送过来的信号 无法调用shell中的变量

参数是一个JSON格式的数组,其中<executable>为要运行的 命令,后面的<paramN>为传递给命令的选项或参数;然而,此种格式指定的命令不会以“/bin/sh -c”来发起,因此常见的shell操作如变量替换以及通配符(?,* 等)替换将不会进行;不过,如果要运行的命令依赖于此shell特性的话,可以将其替换为类似下面的格式

RUN ["/bin/bash", "-c", "<executable>", "<param1>"]

CMD指令

CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止. 不过CMD指定的命令其可以被docker run的命令行选项所覆盖

CMD命令的执行时间周期 就是容器的生命周期 CMD一旦执行完毕  容器就会立即停止  CMD指令只有最后一个指令生效

CMD指令一般不会单独使用  通常都需要配合 ENTRYPOINT指令来设置

CMD <command>

CMD [“<executable>”, “<param1>”, “<param2>”]

CMD ["<param1>","<param2>"]  为ENTRYPOINT指令提供默认参数

当执行docker run的时候可以在最后添加自定义命令来覆盖CMD中指定的命令

ENTRYPOINT指令

主要用来指定shell的  把shell作为容器中第一个启动进程 通过接收CMD命令 把命令作为参数启动指定的子进程

用来指定容器内核启动的第一个进程 只有PID为1的进程才能接收系统发送给容器的系统信号

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

不过,docker run命令的--entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序

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

一个容器只是为了运行单个程序

每个进程都应该是某个进程的子进程 除了init进程

在shell中启动的任何进程都是shell的子进程 意味着如果shell退出那么在shell中启动的进程都会被终止掉

     一个运行nginx的容器中nginx进程号必须为1 否则由于容器中的nginx进程无法接收系统信号而无法stop和kill掉正在运行的容器

exec 顶替shell进程PID为1 shell进程退出

USER指令

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

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

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

ONBUILD指令

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

Dockerfile用于build映像文件,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件

在后面的这个Dockerfile中的FROM指令在build过程中被执行时,将会“触发”创建其base image的Dockerfile文件中的ONBUILD指令定义的触发器

HEALTHCHECK指令

docker引擎判定容器是否健康的机制是仅仅判定容器是否处于运行状态

判定运行的容器是否正常运行 并不能单一的检测容器是否正在运行 需要更加具体化 需要检测容器中的主进程是否能正常提供服务才行

需要借助外部命令检测 如检测nginx容器是否正常  可以使用命令请求主页 wget -O - -q a1f2903f6de3 获取返回结果 进行健康检查

ARG指令

使用方法和ENV相同 但是只能在docker build执行指令的时候生效 不能在docker run中生效 ENV在两个执行阶段都有效果

使用ARG指令可以用同一个Dockerfile 通过ARG的方式生成不同版本的镜像   相当于给docker build命令传递变量参数

Dockerfile实例

[root@nginx-docker mynginx]# ls
Dockerfile entrypoint.sh index.html [root@nginx-docker mynginx]# vi Dockerfile FROM nginx:1.14-alpine
LABEL maintainer="yxh" RUN mkdir -p /data/web/html
ENV NGX_DOC_ROOT='/data/web/html/'
ADD entrypoint.sh /bin
ADD index.html ${NGX_DOC_ROOT} EXPOSE
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"] [root@nginx-docker mynginx]# vi entrypoint.sh #!/bin/sh cat > /etc/nginx/conf.d/www.conf << EOF
server
{
server_name $HOSTNAME;
listen ${IP:-0.0.0.0}:${PORT:-};
root $NGX_DOC_ROOT;
}
EOF exec "$@" ######调试容器##########
[root@nginx-docker mynginx]# docker run --name nginx1 -it nginx:1.14-alpine nginx1默认启动的不是/bin/sh 所以即使使用-it 选项也无法进入容器
[root@nginx-docker mynginx]# docker run --name nginx1 -it nginx:1.14-alpine /bin/sh
/ # ifconfig
如果要进入交互式容器需要在最后添加启动命令 /bin/sh来覆盖CMD命令
这样就可以进入容器
/ # ps aux
PID USER TIME COMMAND
root : /bin/sh
root : ps aux 调试容器步骤 无论什么容器都可以采取这种方式
docker run --name myweb1 --rm -it myweb:v0.- /bin/sh
docker exec -it myweb1 /bin/sh 进入已经运行的容器 /usr/sbin # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0.0.0.0: 0.0.0.0:* LISTEN /data # wget -O - -q a1f2903f6de3
<h1> my nginx index page </h1>
/data # 有环境变量的最大好处在docker run的时候可以直接根据变量生成各种
应用程序的配置文件
定义应用程序的配置文件的时候就只需要调用变量名称即可
docker run -e "HOSTNAME=yxh" --name yxhweb myweb2:v1. / # vi /etc/hosts
/ # wget -O - -q yxh
<h1> my nginx index page </h1>

Dockerfile实例

Dockerfile语法解析的更多相关文章

  1. 四:(之五)Dockerfile语法梳理和实践

    *5.Dockerfile语法梳理和实践 5.1 尽量使用官方的image作为base image 5.2 metadata:指明作者 版本 描述 5.3 每一条run都能形成一个分层,避免无用分层应 ...

  2. With语句以及@contextmanager的语法解析

    with 语句以及@contextmanager的语法解析   with语句可以通过很简单的方式来替try/finally语句. with语句中EXPR部分必须是一个包含__enter__()和__e ...

  3. MySQL- -Join语法解析与性能分析

    Mysql Join语法解析与性能分析 一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ...

  4. 更改AngularJS的语法解析符号

    // 更改AngularJS的语法解析符号 app.config(function ($interpolateProvider) { $interpolateProvider.startSymbol( ...

  5. 转换器4:手写PHP转Python编译器,语法解析部分

    写完词法部分,又有很多杂事,周末终于有空来实现伟大的语法解析部分了. 撸完代码之后发现,程序太短了,不算上状态机,才186行(含注释),关键代码不到100行.运行调试过后,发现还行.居然可以解析One ...

  6. 在.NET Core中使用Irony实现自己的查询语言语法解析器

    在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...

  7. Generator函数语法解析

    转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...

  8. JSP编译成Servlet(一)语法树的生成——语法解析

    一般来说,语句按一定规则进行推导后会形成一个语法树,这种树状结构有利于对语句结构层次的描述.同样Jasper对JSP语法解析后也会生成一棵树,这棵树各个节点包含了不同的信息,但对于JSP来说解析后的语 ...

  9. 用java实现编译器-算术表达式及其语法解析器的实现

    大家在参考本节时,请先阅读以下博文,进行预热: http://blog.csdn.net/tyler_download/article/details/50708807 本节代码下载地址: http: ...

随机推荐

  1. [UI] 06 - jQuery

    前言 From : http://www.runoob.com/jquery/jquery-intro.html Ref: jQuery 实例 一.什么是 jQuery ? jQuery是一个Java ...

  2. 正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,如何生成Q中的前几项

    思路分析:可以与归并排序联系起来,给定两个变量A.B,变量A轮着存放:a*1,a*2,a*3,……变量组B轮着存放:b*1,b*2,b*3,……有两个整数i.j,分别代表A.B第i.j次存放的值,每次 ...

  3. 为何谷歌围棋AI AlphaGo可能会把李世石击溃

    /* 版权声明:可以随意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 谷歌DeepMind开发的人工智能围棋程序AlphaGo以5:0的压倒性优势击败了欧洲围棋冠军.专业二 ...

  4. python socket 实现的简单http服务器

    预备知识: 关于http 协议的基础请参考这里. 关于socket 基础函数请参考这里. 关于python 网络编程基础请参考这里. 一.python socket 实现的简单http服务器   废话 ...

  5. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)

    第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三篇 朴素贝叶斯文本分类 支持向量机分类 支持向量机 网格搜索 临近法 决策树 随机森林 bagging方法 import pandas as pd ...

  6. MongoDB数据库连接失败

    win10下原来一直在用的MongoDB突然连接不上了,报错如下: 解决方法是:net start MongoDB重启服务

  7. 在Web根目录下建立testdb.php文件内容

    apache_2.0.50-win32-x86-no_ssl.msi php-5.0.0-Win32.zipmysql-4.0.20d-win.zipphpMyAdmin-2.5.7.zip 操作系统 ...

  8. python----流程控制

    计算机程序在解决某个具体问题时,包括三种情形,即顺序执行所有的语句.选择执行部分的语句和循环执行部分语句,这正好对应着程序设计中的三种程序执行结构流程:顺序结构.选择结构和循环结构. 事实证明,任何一 ...

  9. ubuntu16.04安装 catkin_tools

    参考:https://catkin-tools.readthedocs.io/en/latest/installing.html First you must have the ROS reposit ...

  10. 【单调栈】hdu 6319 杭电多校Problem A. Ascending Rating

    http://acm.hdu.edu.cn/showproblem.php?pid=6319 从后往前更新,维护一个递减单调栈(队列) 最近很多题都是单调栈... #define _CRT_SECUR ...