脑子瞎的时候丶有眼睛也没用 發表於 2019-1-9 14:03:00

Docker系列07—Dockerfile 详解

<p><strong><strong>本文收录在<span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">容器技术学习系列文章总目录</span></span></strong></strong></p>
<h2><strong>1<span style="font-family: 微软雅黑">、认识</span><span style="font-family: Arial">Dockerfile</span></strong></h2>
<h3><strong>1.1 <span style="font-family: 微软雅黑">镜像的生成途径</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<strong><span style="font-family: 微软雅黑">基于容器制作</span></strong></li>
<li style="margin-left: 30px"><strong>&nbsp;dockerfile<span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">docker build</span></strong></li>
</ul>
<p><span style="font-family: 微软雅黑">  基于容器制作镜像,已经在上篇Docker系列06—基于容器制作镜像并上传到Docker Registry详细讲解过了,大家有需要可以去上篇查找;这篇主要讲解基于</span>Dockerfile<span style="font-family: 微软雅黑">,使用</span><span style="font-family: Arial">docker build </span><span style="font-family: 微软雅黑">命令制作镜像。</span></p>
<p>&nbsp;</p>
<h3><strong>1.2 Dockerfile <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<p>  Docker<span style="font-family: 微软雅黑">中有个非常重要的概念叫做</span><span style="font-family: Arial">——</span><span style="font-family: 微软雅黑">镜像(</span><span style="font-family: Arial">Image</span><span style="font-family: 微软雅黑">)。</span><span style="font-family: Arial">Docker </span><span style="font-family: 微软雅黑">镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。</span></p>
<p><span style="font-family: 微软雅黑">  镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是</span> Dockerfile<span style="font-family: 微软雅黑">。</span></p>
<p>  Dockerfile <span style="font-family: 微软雅黑">是一个文本文件,其内<strong>包含了一条条的指令</strong></span><strong><span style="font-family: Arial">(Instruction)</span></strong><span style="font-family: 微软雅黑">,<strong>每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建</strong>。</span></p>
<p>&nbsp;</p>
<h3><strong>1.3 Dockerfile <span style="font-family: 微软雅黑">指令</span></strong></h3>
<ul>
<li style="margin-left: 30px">FROM</li>
<li style="margin-left: 30px">MAINTAINER</li>
<li style="margin-left: 30px">COPY</li>
<li style="margin-left: 30px">ADD</li>
<li style="margin-left: 30px">WORKDIR</li>
<li style="margin-left: 30px">VOLUME</li>
<li style="margin-left: 30px">EXPOSE</li>
<li style="margin-left: 30px">ENV</li>
<li style="margin-left: 30px">RUN</li>
<li style="margin-left: 30px">CMD</li>
<li style="margin-left: 30px">ENTRYPOINT</li>
<li style="margin-left: 30px">HEALTHCHECK</li>
<li style="margin-left: 30px">ONBUILD</li>
<li style="margin-left: 30px">USER</li>
<li style="margin-left: 30px">ARG</li>
<li style="margin-left: 30px">SHELL</li>
<li style="margin-left: 30px">STOPSIGNAL</li>
</ul>
<p>&nbsp;</p>
<h3><strong>1.4 Dockerfile <span style="font-family: 微软雅黑">的使用</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)</span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">编写的基本结构</span></p>
<p>Dockerfile <span style="font-family: 微软雅黑">一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,</span><span style="font-family: Arial">’#’ </span><span style="font-family: 微软雅黑">为 </span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">中的注释。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)一台主机可以有多个</span><span style="font-family: Arial">Dockerfile</span></p>
<p><span style="font-family: 微软雅黑">  要使用多个</span>Dockerfile <span style="font-family: 微软雅黑">创建镜像,可以在不同目录编写</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">,然后在</span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">所在的目录下构建新的镜像;</span></p>
<p><span style="font-family: 微软雅黑">  注意:</span>Dockerfile <span style="font-family: 微软雅黑">中所包含的需要的内容;如</span><span style="font-family: Arial">COPY</span><span style="font-family: 微软雅黑">的文件、目录等,都需要在</span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">同级目录下存在;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)</span><span style="font-family: Arial">docker build </span><span style="font-family: 微软雅黑">基于</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">制作镜像的命令</span></p>
<p>① <span style="font-family: 微软雅黑">格式:</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">docker build PATH | URL | -</pre>
</div>
<p>② <span style="font-family: 微软雅黑">选项:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;-t<span style="font-family: 微软雅黑">:打标签</span></li>
<li style="margin-left: 30px">&nbsp;-c<span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">- cpu-shares int </span><span style="font-family: 微软雅黑">:</span><span style="font-family: Arial">CPU</span><span style="font-family: 微软雅黑">份额(相对权重)</span></li>
<li style="margin-left: 30px">&nbsp;-m<span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">- memory bytes</span><span style="font-family: 微软雅黑">:内存限制</span></li>
<li style="margin-left: 30px">&nbsp;--build-arg<span style="font-family: 微软雅黑">:设置构建时变量,就是构建的时候修改</span><span style="font-family: Arial">ARG</span><span style="font-family: 微软雅黑">指令的参数</span></li>
</ul>
<p>&nbsp;</p>
<h2><strong>2<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">FROM </span><span style="font-family: 微软雅黑">指令</span></strong></h2>
<h3><strong>2.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;FROM <span style="font-family: 微软雅黑">指令必须是 </span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">中</span><strong><span style="font-family: 微软雅黑">非注释行的第一个指令</span></strong><span style="font-family: 微软雅黑">,即一个</span> Dockerfile <span style="font-family: 微软雅黑">从</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">语句;</span></li>
<li style="margin-left: 30px">&nbsp;FROM <span style="font-family: 微软雅黑">指令用于</span><strong><span style="font-family: 微软雅黑">为镜像文件构建过程指定基础镜像</span></strong><span style="font-family: 微软雅黑">,后续的指令运行于此基础镜像所提供的运行环境;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">实践中,基准镜像可以是任何可用镜像文件,默认情况下,</span>docker build<span style="font-family: 微软雅黑">会在</span><strong>docker<span style="font-family: 微软雅黑">主机上查找指定的镜像文件</span></strong><span style="font-family: 微软雅黑">,在其不存在时,则</span><strong><span style="font-family: 微软雅黑">会自动从</span> Docker <span style="font-family: 微软雅黑">的公共库</span></strong>&nbsp;pull <span style="font-family: 微软雅黑">镜像下来。如果找不到指定的镜像文件,</span><span style="font-family: Arial">docker build </span><span style="font-family: 微软雅黑">会返回一个错误信息;</span></li>
<li style="margin-left: 30px">&nbsp;FROM<span style="font-family: 微软雅黑">可以在一个 </span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">中出现多次,如果有需求在一个 </span><span style="font-family: Arial">Dockerfile </span><span style="font-family: 微软雅黑">中创建多个镜像。</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span>FROM<span style="font-family: 微软雅黑">语句没有指定镜像标签,则</span><strong><span style="font-family: 微软雅黑">默认使用</span>latest<span style="font-family: 微软雅黑">标签</span></strong><span style="font-family: 微软雅黑">。</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>2.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM &lt;repository&gt;[:&lt;tag&gt;] 或
FROM &lt;repository&gt;@&lt;digest&gt;</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;&lt;repository&gt;<span style="font-family: 微软雅黑">:指定作为</span><span style="font-family: Arial">base image</span><span style="font-family: 微软雅黑">的名称;</span></li>
<li style="margin-left: 30px">&nbsp;&lt;tag&gt;<span style="font-family: 微软雅黑">:</span><span style="font-family: Arial">base image</span><span style="font-family: 微软雅黑">的标签,省略时默认</span><span style="font-family: Arial">latest</span><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;&lt;digest&gt;<span style="font-family: 微软雅黑">:是镜像的哈希码;使用哈希码会更安全一点;</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>2.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
</pre>
</div>
<p>&nbsp;</p>
<h2><strong>3<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">MAINTAINER</span></strong></h2>
<h3><strong>3.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于让</span>dockerfile<span style="font-family: 微软雅黑">制作者提供本人的详细信息</span></li>
<li style="margin-left: 30px">&nbsp;dockerfile <span style="font-family: 微软雅黑">并不限制</span><span style="font-family: Arial">MAINTAINER </span><span style="font-family: 微软雅黑">指令可在出现的位置,但推荐将其放置于</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">指令之后</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>3.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">MAINTAINER &lt;authtor's detail&gt;</pre>
</div>
<p>&nbsp;</p>
<h3><strong>3.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"</pre>
</div>
<p>&nbsp;</p>
<h2><strong>4<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">COPY</span></strong></h2>
<h3><strong>4.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于从</span>docker <span style="font-family: 微软雅黑">主机复制新文件或者目录至创建的新镜像指定路径中</span><span style="font-family: Arial">&nbsp;</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>4.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">COPY &lt;src&gt;... &lt;dest&gt;或
COPY ["&lt;src&gt;",... "&lt;dest&gt;"]</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;&lt;src&gt;<span style="font-family: 微软雅黑">:要复制的源文件或目录,</span><strong><span style="font-family: 微软雅黑">支持使用通配符</span></strong><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;&lt;dest&gt;<span style="font-family: 微软雅黑">:目标路径,即正在创建的</span><span style="font-family: Arial">image</span><span style="font-family: 微软雅黑">的文件系统路径;</span><strong><span style="font-family: 微软雅黑">建议</span>&lt;dest&gt;<span style="font-family: 微软雅黑">使用绝对路径</span></strong><span style="font-family: 微软雅黑">,否则,</span>COPY<span style="font-family: 微软雅黑">指定以</span><span style="font-family: Arial">WORKDIR</span><span style="font-family: 微软雅黑">为其实路径</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">在路径中有空白字符时,通常使用第</span>2<span style="font-family: 微软雅黑">中格式;</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>4.3 <span style="font-family: 微软雅黑">文件复制准则</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;&lt;src&gt;<span style="font-family: 微软雅黑">必须是</span><span style="font-family: Arial">build</span><span style="font-family: 微软雅黑">上下文中的路径,</span><strong><span style="font-family: 微软雅黑">不能是其父目录中的文件</span></strong><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span><strong>&lt;src&gt;<span style="font-family: 微软雅黑">是目录</span></strong><span style="font-family: 微软雅黑">,则其</span><strong><span style="font-family: 微软雅黑">内部文件或子目录会被递归复制</span></strong><span style="font-family: 微软雅黑">,但</span><strong>&lt;src&gt;<span style="font-family: 微软雅黑">目录自身不会被复制</span></strong><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果指定了多个</span>&lt;src&gt;<span style="font-family: 微软雅黑">,或在</span><span style="font-family: Arial">&lt;src&gt;</span><span style="font-family: 微软雅黑">中使用了通配符,则</span><span style="font-family: Arial">&lt;dest&gt;</span><span style="font-family: 微软雅黑">必须是一个目录,且</span><strong><span style="font-family: 微软雅黑">必须以</span> / <span style="font-family: 微软雅黑">结尾</span></strong><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span>&lt;dest&gt;<span style="font-family: 微软雅黑">事先不存在,他将</span><strong><span style="font-family: 微软雅黑">会被自动创建</span></strong><span style="font-family: 微软雅黑">,这包括父目录路径。</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>4.4 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<h4><strong>4.4.1 COPY <span style="font-family: 微软雅黑">文件</span></strong></h4>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
COPY index.html /data/web/html/    #要确保dockerfile 同级路径下有index.html文件
</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)在</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">同级目录下准备好</span><span style="font-family: Arial">index.html</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">$ vim index.html
&lt;h1&gt;Busybox httpd server&lt;/h1&gt;</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">$ docker build -t busyboxhttpd:v0.1 ./
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/3 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Running in 0d6f4c1c0e8d
---&gt; 5d2cda1631d7
Removing intermediate container 0d6f4c1c0e8d
Step 3/3 : COPY index.html /data/web/html/
---&gt; 2e0fe0eb0cb7
Removing intermediate container 536fdc71472a
Successfully built 2e0fe0eb0cb7
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>4<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 --rm busyboxhttpd:v0.1 cat /data/web/html/index.html
&lt;h1&gt;Busybox httpd server&lt;/h1&gt; </pre>
</div>
<p>注:--rm:在容器关闭时,直接删除容器,方便实验。</p>
<p>&nbsp;</p>
<h4><strong>4.4.2 COPY <span style="font-family: 微软雅黑">目录</span></strong></h4>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/</pre>
</div>
<p><span style="font-family: 微软雅黑">注:如果是复制目录,则其</span><strong><span style="font-family: 微软雅黑">内部文件或子目录会被递归复制</span></strong><span style="font-family: 微软雅黑">,但</span><strong>&lt;src&gt;<span style="font-family: 微软雅黑">目录自身不会被复制;需要把复制目录名字也写在容器中要复制的路径下!</span></strong></p>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)在</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">同级目录下准备好</span><span style="font-family: Arial">yum.repos.d </span><span style="font-family: 微软雅黑">目录</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># cp -r /etc/yum.repos.d/ ./
# ls yum.repos.d
along.repodocker-ce.repoepel-release-latest-7.noarch.rpmepel.repoepel-testing.repo
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.2 ./
Sending build context to Docker daemon 27.65 kB
Step 1/4 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/4 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/4 : COPY index.html /data/web/html/
---&gt; Using cache
---&gt; 2e0fe0eb0cb7
Step 4/4 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; 68586925bdf9
Removing intermediate container a01f824efa3e
Successfully built 68586925bdf9
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>4<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 --rm busyboxhttpd:v0.2 ls /etc/yum.repos.d/
along.repo
docker-ce.repo
epel-release-latest-7.noarch.rpm
epel-testing.repo
epel.repo
</pre>
</div>
<p>  </p>
<h2><strong>5<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ADD</span></strong></h2>
<h3><strong>5.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">ADD <span style="font-family: 微软雅黑">指令类似于</span><span style="font-family: Arial">COPY</span><span style="font-family: 微软雅黑">指令,</span><span style="font-family: Arial">ADD</span><span style="font-family: 微软雅黑">支持使用</span><span style="font-family: Arial">TAR</span><span style="font-family: 微软雅黑">文件和</span><span style="font-family: Arial">URL</span><span style="font-family: 微软雅黑">路径</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>5.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">ADD &lt;src&gt; .. &lt;dest&gt;或
ADD ["&lt;src&gt;".. "&lt;dest&gt;"]</pre>
</div>
<p>&nbsp;</p>
<h3><strong>5.3 <span style="font-family: 微软雅黑">操作准则</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">同</span>COPY<span style="font-family: 微软雅黑">指令</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span>&lt;src&gt;<span style="font-family: 微软雅黑">为</span><span style="font-family: Arial">URL</span><span style="font-family: 微软雅黑">且</span><span style="font-family: Arial">&lt;dest&gt;</span><span style="font-family: 微软雅黑">不以 </span><span style="font-family: Arial">/ </span><span style="font-family: 微软雅黑">结尾,则</span><span style="font-family: Arial">&lt;src&gt;</span><span style="font-family: 微软雅黑">指定的文件</span><strong><span style="font-family: 微软雅黑">将被下载并直接被创建</span></strong><span style="font-family: 微软雅黑">为</span>&lt;dest&gt;;<span style="font-family: 微软雅黑">如果</span><span style="font-family: Arial">&lt;dest&gt;</span><span style="font-family: 微软雅黑">以</span><span style="font-family: Arial">/</span><span style="font-family: 微软雅黑">结尾,则文件名</span><span style="font-family: Arial">URL</span><span style="font-family: 微软雅黑">指定的文件将被直接下载并保存为</span><span style="font-family: Arial">&lt;dest&gt;/ &lt;filename&gt;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span>&lt;src&gt;<span style="font-family: 微软雅黑">是</span><strong><span style="font-family: 微软雅黑">一个本地系统上的压缩格式的</span>tar<span style="font-family: 微软雅黑">文件</span></strong><span style="font-family: 微软雅黑">,它将</span><strong><span style="font-family: 微软雅黑">被展开为一个目录</span></strong><span style="font-family: 微软雅黑">,其行为类似于</span>"tar-x"<span style="font-family: 微软雅黑">命令;然而,</span><strong><span style="font-family: 微软雅黑">通过</span>URL<span style="font-family: 微软雅黑">获取到的</span><span style="font-family: Arial">tar</span><span style="font-family: 微软雅黑">文件将不会自动展开</span></strong>;</li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果</span>&lt;src&gt;<span style="font-family: 微软雅黑">有多个,或其间接或直接使用了通配符,则</span><span style="font-family: Arial">&lt;dest&gt;</span><span style="font-family: 微软雅黑">必须是一个以</span><span style="font-family: Arial">/</span><span style="font-family: 微软雅黑">结尾的目录路径 </span><span style="font-family: Arial">;</span><span style="font-family: 微软雅黑">如果</span><span style="font-family: Arial">&lt;dest&gt;</span><span style="font-family: 微软雅黑">不以</span><span style="font-family: Arial">/</span><span style="font-family: 微软雅黑">结尾,则其被视作一个普通文件,</span><span style="font-family: Arial">&lt;src&gt;</span><span style="font-family: 微软雅黑">的内容将被直接写入到</span><span style="font-family: Arial">&lt;dest&gt;;</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>5.4 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<h4><strong>5.4.1 COPY <span style="font-family: 微软雅黑">网上路径(URL)的</span><span style="font-family: Arial">tar</span><span style="font-family: 微软雅黑">包</span></strong></h4>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span>ADD <span style="font-family: 微软雅黑">的</span><span style="font-family: Arial">&lt;src&gt; </span><span style="font-family: 微软雅黑">是网上的</span><span style="font-family: Arial">nginx</span><span style="font-family: 微软雅黑">下载路径</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.3 ./
Sending build context to Docker daemon 27.65 kB
Step 1/5 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/5 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/5 : COPY index.html /data/web/html/
---&gt; Using cache
---&gt; 2e0fe0eb0cb7
Step 4/5 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; Using cache
---&gt; 68586925bdf9
Step 5/5 : ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
Downloading 1.028 MB/1.028 MB
---&gt; 91c71b469a9e
Removing intermediate container abbad8dcdefb
Successfully built 91c71b469a9e
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 --rm busyboxhttpd:v0.3 ls /usr/local/src
nginx-1.15.8.tar.gz
</pre>
</div>
<p>  </p>
<h4><strong>5.4.2 COPY <span style="font-family: 微软雅黑">本地的路径的</span><span style="font-family: Arial">tar</span><span style="font-family: 微软雅黑">包</span></strong></h4>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
ADD nginx-1.15.8.tar.gz /usr/local/src/
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)在</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">同级目录下准备好</span><span style="font-family: Arial">yum.repos.d </span><span style="font-family: 微软雅黑">目录</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># wget http://nginx.org/download/nginx-1.15.8.tar.gz
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.4 ./
Sending build context to Docker daemon 1.056 MB
Step 1/5 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/5 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/5 : COPY index.html /data/web/html/
---&gt; Using cache
---&gt; 2e0fe0eb0cb7
Step 4/5 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; Using cache
---&gt; 68586925bdf9
Step 5/5 : ADD nginx-1.15.8.tar.gz /usr/local/src/
---&gt; f99baec4b992
Removing intermediate container 7f02f3fe649e
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>4<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 --rm busyboxhttpd:v0.4 ls /usr/local/src /usr/local/src/nginx-1.15.8
/usr/local/src:
nginx-1.15.8

/usr/local/src/nginx-1.15.8:
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
</pre>
</div>
<p>  </p>
<h2><strong>6<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">WORKDIR</span></strong></h2>
<h3><strong>6.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于为</span>Dockerfile<span style="font-family: 微软雅黑">中所有的</span><span style="font-family: Arial">RUN</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">CMD</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ENTRYPOINT</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">COPY</span><span style="font-family: 微软雅黑">和</span><span style="font-family: Arial">ADD</span><span style="font-family: 微软雅黑">指定</span><strong><span style="font-family: 微软雅黑">设定工作目录</span></strong></li>
</ul>
<p>&nbsp;</p>
<h3><strong>6.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">WORKDIR &lt;dirpath&gt;</pre>
</div>
<p><span style="font-family: 微软雅黑">  在</span>Dockerfile<span style="font-family: 微软雅黑">文件中,</span><strong>WORKDIR<span style="font-family: 微软雅黑">指令可出现多次</span></strong><span style="font-family: 微软雅黑">,其路径也可以为相对路径,不过,其是相对此</span><strong><span style="font-family: 微软雅黑">前一个</span>WORKDIR</strong><span style="font-family: 微软雅黑">指令指定的路径;</span></p>
<p><span style="font-family: 微软雅黑">  另外,</span>WORKDIR<span style="font-family: 微软雅黑">也可调用由</span><span style="font-family: Arial">ENV</span><span style="font-family: 微软雅黑">指定定义的变量;</span></p>
<p>&nbsp;</p>
<h3><strong>6.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD nginx-1.15.8.tar.gz ./src/
</pre>
</div>
<p>  </p>
<h2><strong>7<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">VOLUME</span></strong></h2>
<h3><strong>7.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于在</span>image<span style="font-family: 微软雅黑">中创建一个挂载点目录,以挂载</span><span style="font-family: Arial">Docker&nbsp;host.</span><span style="font-family: 微软雅黑">上的卷或其它容器上的卷</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>7.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">VOLUME &lt;mountpoint&gt;或
VOLUME ["&lt;mountpoint&gt;"]
</pre>
</div>
<p><span style="font-family: 微软雅黑">注:如果挂载点目录路径下此前在文件存在,</span>docker&nbsp;run<span style="font-family: 微软雅黑">命令会在卷挂载完成后将此前的所有文件复制到新挂载的卷中</span></p>
<p>&nbsp;</p>
<h3><strong>7.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"

COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.15.8.tar.gz ./src/

VOLUME /data/mysql
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.5 ./
Sending build context to Docker daemon 1.056 MB
Step 1/7 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/7 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/7 : COPY index.html /data/web/html/
---&gt; Using cache
---&gt; 2e0fe0eb0cb7
Step 4/7 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; Using cache
---&gt; 68586925bdf9
Step 5/7 : WORKDIR /usr/local/
---&gt; Using cache
---&gt; 84ad38ba3b4d
Step 6/7 : ADD nginx-1.15.8.tar.gz ./src/
---&gt; Using cache
---&gt; b32e992f51c5
Step 7/7 : VOLUME /data/mysql
---&gt; Running in 270bd9a938eb
---&gt; 90d592698082
Removing intermediate container 270bd9a938eb
Successfully built 90d592698082
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 --rm -it busyboxhttpd:v0.5 /bin/sh
/usr/local #
--- 另打开一个终端,查询存储卷
# docker inspect -f {{.Mounts}} web1
[{volume b788b8a50d69953e2b086b3b54ba683154647319a481246cb7ab2ff927b21372 /var/lib/docker/volumes/b788b8a50d69953e2b086b3b54ba683154647319a481246cb7ab2ff927b21372/_data /data/mysql localtrue }]
</pre>
</div>
<p>  </p>
<h2><strong>8<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">EXPOSE</span></strong></h2>
<h3><strong>8.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于为容器</span><strong><span style="font-family: 微软雅黑">打开指定要监听的端口</span></strong><span style="font-family: 微软雅黑">以实现与外部通信</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>8.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">EXPOSE &lt;port&gt;[/ &lt;protocol&gt;] [&lt;port&gt;[/ &lt;protocol&gt;] ....</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;&lt;protocol&gt;<span style="font-family: 微软雅黑">用于</span><strong><span style="font-family: 微软雅黑">指定传输层协议</span></strong><span style="font-family: 微软雅黑">,可为</span>tcp<span style="font-family: 微软雅黑">或</span><span style="font-family: Arial">udp</span><span style="font-family: 微软雅黑">二者之一,</span><strong><span style="font-family: 微软雅黑">默认为</span>TCP<span style="font-family: 微软雅黑">协议</span></strong></li>
<li style="margin-left: 30px">&nbsp;EXPOSE<span style="font-family: 微软雅黑">指令</span><strong><span style="font-family: 微软雅黑">可一次指定多个端口</span></strong><span style="font-family: 微软雅黑">,例如:</span>EXPOSE 11211/udp 11211/tcp</li>
</ul>
<p>&nbsp;</p>
<h3><strong>8.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"

COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD nginx-1.15.8.tar.gz ./src/

VOLUME /data/mysql

EXPOSE 80/tcp
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.6 ./
Sending build context to Docker daemon 1.056 MB
Step 1/8 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/8 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/8 : COPY index.html /data/web/html/
---&gt; Using cache
---&gt; 2e0fe0eb0cb7
Step 4/8 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; Using cache
---&gt; 68586925bdf9
Step 5/8 : WORKDIR /usr/local/
---&gt; Using cache
---&gt; 84ad38ba3b4d
Step 6/8 : ADD nginx-1.15.8.tar.gz ./src/
---&gt; Using cache
---&gt; b32e992f51c5
Step 7/8 : VOLUME /data/mysql
---&gt; Using cache
---&gt; 90d592698082
Step 8/8 : EXPOSE 80/tcp
---&gt; Running in 53b13561994d
---&gt; 182463025992
Removing intermediate container 53b13561994d
Successfully built 182463025992
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>4<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 -P --rm -it busyboxhttpd:v0.6 /bin/httpd -f -h /data/web/html
--- 另打开一个终端,验证httpd 服务的80端口
# docker inspect -f {{.NetworkSettings.IPAddress}} web1#查询容器的IP
172.17.0.2
# curl 172.17.0.2:80
&lt;h1&gt;Busybox httpd server&lt;/h1&gt;
--- 在宿主机通过暴露的端口访问httpd 服务
# docker port web1
80/tcp -&gt; 0.0.0.0:32768
# curl 127.0.0.1:32768
&lt;h1&gt;Busybox httpd server&lt;/h1&gt;</pre>
</div>
<p><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 微软雅黑">注:就算</span>dockerfile <span style="font-family: 微软雅黑">中有</span><span style="font-family: Arial">EXPOSE </span><span style="font-family: 微软雅黑">指令暴露端口,但是不是真正的暴露;需要在启动容器时,使用</span><span style="font-family: Arial">-P </span><span style="font-family: 微软雅黑">选项真正的暴露端口。</span></strong></span></p>
<p>&nbsp;</p>
<h2><strong>9<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ENV</span></strong></h2>
<h3><strong>9.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于为镜像定义所需的</span><strong><span style="font-family: 微软雅黑">环境变量</span></strong><span style="font-family: 微软雅黑">,并可被</span>Dockerfile<span style="font-family: 微软雅黑">文件中</span><strong><span style="font-family: 微软雅黑">位于其后的</span></strong><span style="font-family: 微软雅黑">其它指令</span>(<span style="font-family: 微软雅黑">如</span><span style="font-family: Arial">ENV</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ADD</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">COPY</span><span style="font-family: 微软雅黑">等</span><span style="font-family: Arial">)</span><span style="font-family: 微软雅黑">所调用</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">调用格式为</span>$variable_ name <span style="font-family: 微软雅黑">或 </span><span style="font-family: Arial">${variable_ name}</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>9.2 <span style="font-family: 微软雅黑">格式</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">ENV &lt;key&gt; &lt;value&gt;或
ENV &lt;key&gt;=&lt;value&gt; . .</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;<strong><span style="font-family: 微软雅黑">第一种格式</span></strong><span style="font-family: 微软雅黑">中,</span>&lt;key&gt;<span style="font-family: 微软雅黑">之后的所有内容均会被视作其</span><span style="font-family: Arial">&lt;value&gt;</span><span style="font-family: 微软雅黑">的组成部分, 因此,</span><strong><span style="font-family: 微软雅黑">一次只能设置一个变量</span>;</strong></li>
<li style="margin-left: 30px">&nbsp;<strong><span style="font-family: 微软雅黑">第二种格式可用一次设置多个变量</span></strong><span style="font-family: 微软雅黑">,每个变量为一个</span>”&lt;key&gt;=&lt;value&gt;"<span style="font-family: 微软雅黑">的键值对,</span><strong><span style="font-family: 微软雅黑">如果</span>&lt;value&gt;<span style="font-family: 微软雅黑">中包含空格,可以以反斜线(</span><span style="font-family: Arial">\</span><span style="font-family: 微软雅黑">)进行转义</span></strong><span style="font-family: 微软雅黑">,也可通过对</span>&lt;value&gt;<span style="font-family: 微软雅黑">加引号进行标识;另外,</span><strong><span style="font-family: 微软雅黑">反斜线也可用于续行</span></strong>;</li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">定义多个变量时,</span><strong><span style="font-family: 微软雅黑">建议使用第二种方式</span></strong><span style="font-family: 微软雅黑">,以便在同一层中完成所有功能</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>9.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.15.8"

COPY index.html ${DOC_ROOT}
COPY yum.repos.d /etc/yum.repos.d/

#ADD http://nginx.org/download/nginx-1.15.8.tar.gz /usr/local/src/
WORKDIR /usr/local/
ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/

VOLUME /data/mysql

EXPOSE 8080:80/tcp
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">Sending build context to Docker daemon 1.056 MB
Step 1/9 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/9 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/9 : ENV DOC_ROOT /data/web/html/ WEB_SERVER_PACKAGE "nginx-1.15.8"
---&gt; Running in b268b672236a
---&gt; 295bf19a8395
Removing intermediate container b268b672236a
Step 4/9 : COPY index.html ${DOC_ROOT}
---&gt; c29d3c8f6e0d
Removing intermediate container 33238b2ba6bf
Step 5/9 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; 3a2a2f571b07
Removing intermediate container bc49392442bc
Step 6/9 : WORKDIR /usr/local/
---&gt; a695a7f0265f
Removing intermediate container aa12de3e47db
Step 7/9 : ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
---&gt; aca798ede129
Removing intermediate container 4cf601151915
Step 8/9 : VOLUME /data/mysql
---&gt; Running in 497595d537a7
---&gt; 8f52b722011c
Removing intermediate container 497595d537a7
Step 9/9 : EXPOSE 8080:80/tcp
---&gt; Running in 1dac584db62d
---&gt; b10c56601efb
Removing intermediate container 1dac584db62d
Successfully built b10c56601efb
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 -P --rm -it busyboxhttpd:v0.7 ls /usr/local/src /data/web/html
/data/web/html:
index.html

/usr/local/src:
nginx-1.15.8
--- 也可以使用printenv 查看变量验证
# docker run --name web1 --rm -it busyboxhttpd:v0.7
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DOC_ROOT=/data/web/html/
WEB_SERVER_PACKAGE=nginx-1.15.8
--- 在启动容器时,使用docker run -e 设置修改变量
# docker run --name web1 -e WEB_SERVER_PACKAGE=nginx-1.15.7 --rm -it busyboxhttpd:v0.7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
WEB_SERVER_PACKAGE=nginx-1.15.7
DOC_ROOT=/data/web/html/
</pre>
</div>
<p>  </p>
<h2><strong>10<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">RUN</span></strong></h2>
<h3><strong>10.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于指定</span>docker build<span style="font-family: 微软雅黑">过程中运行的程序,其可以是任何命令</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>10.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">RUN &lt;command&gt;或
RUN ["&lt;executable&gt;", "&lt;param1&gt;", "&lt;param2&gt;"]</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">第一种格式中,</span>&lt;command&gt;<span style="font-family: 微软雅黑">通常是一个</span><strong>shell<span style="font-family: 微软雅黑">命令</span></strong><span style="font-family: 微软雅黑">,</span> <span style="font-family: 微软雅黑">且</span><strong><span style="font-family: 微软雅黑">以</span>“/bin/sh -c”<span style="font-family: 微软雅黑">来运行</span></strong><span style="font-family: 微软雅黑">它,这意味着此进程在容器中的</span>PID<span style="font-family: 微软雅黑">不为</span><span style="font-family: Arial">1,</span><span style="font-family: 微软雅黑">不能接收</span><span style="font-family: Arial">Unix</span><span style="font-family: 微软雅黑">信号,因此,</span><strong><span style="font-family: 微软雅黑">当使用</span>docker stop &lt;container&gt;<span style="font-family: 微软雅黑">命令停止容器时,此进程接收不到</span><span style="font-family: Arial">SIGTERM</span><span style="font-family: 微软雅黑">信号</span></strong><span style="font-family: 微软雅黑">;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">第二种语法格式中的参数是一个</span><strong>JSON<span style="font-family: 微软雅黑">格式的数组</span></strong><span style="font-family: 微软雅黑">,其中</span>&lt;executable&gt;<span style="font-family: 微软雅黑">为要运行的命令,后面的 </span><span style="font-family: Arial">&lt;paramN&gt;</span><span style="font-family: 微软雅黑">为传递给命令的选项或参数;然而,此种格式指定的命令</span><strong><span style="font-family: 微软雅黑">不会以</span>“/bin/sh -c”<span style="font-family: 微软雅黑">来发起</span></strong><span style="font-family: 微软雅黑">,因此</span><strong><span style="font-family: 微软雅黑">常见的</span>shell<span style="font-family: 微软雅黑">操作</span></strong><span style="font-family: 微软雅黑">如变量替换以及通配符</span>(?,*<span style="font-family: 微软雅黑">等</span><span style="font-family: Arial">)</span><span style="font-family: 微软雅黑">替换</span><strong><span style="font-family: 微软雅黑">将不会进行</span></strong><span style="font-family: 微软雅黑">;不过,如果要运行的命令依赖于此</span>shell<span style="font-family: 微软雅黑">特性的话,可以将其替换为类似下面的格式。</span></li>
<li style="margin-left: 30px">&nbsp;RUN ["/bin/bash", "-c", "&lt;executable&gt;", "&lt;param1&gt;"]</li>
</ul>
<p>&nbsp;</p>
<h3><strong>10.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件:使用</span><span style="font-family: Arial">RUN </span><span style="font-family: 微软雅黑">执行解压命令</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># Description: test image
FROM busybox:latest
MAINTAINER "Along &lt;along@along.com&gt;"
ENV DOC_ROOT=/data/web/html/ \
    WEB_SERVER_PACKAGE="nginx-1.15.8.tar.gz"

COPY index.html ${DOC_ROOT}
COPY yum.repos.d /etc/yum.repos.d/

WORKDIR /usr/local/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} ./src/
#ADD ${WEB_SERVER_PACKAGE} ./src/

VOLUME /data/mysql

EXPOSE 8080:80/tcp

RUN cd ./src &amp;&amp; \
    tar -xf ${WEB_SERVER_PACKAGE}
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v0.8 ./
Sending build context to Docker daemon 1.056 MB
Step 1/10 : FROM busybox:latest
---&gt; 758ec7f3a1ee
Step 2/10 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/10 : ENV DOC_ROOT /data/web/html/ WEB_SERVER_PACKAGE "nginx-1.15.8.tar.gz"
---&gt; Running in ff660867b971
---&gt; fef5c3f0295a
Removing intermediate container ff660867b971
Step 4/10 : COPY index.html ${DOC_ROOT}
---&gt; 825ae434ab56
Removing intermediate container 0e22f2a6b9c2
Step 5/10 : COPY yum.repos.d /etc/yum.repos.d/
---&gt; 33b5aa2e5b9b
Removing intermediate container 51722b8fcee3
Step 6/10 : WORKDIR /usr/local/
---&gt; 31912ce0b9b1
Removing intermediate container ecfe195635a2
Step 7/10 : ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} ./src/
Downloading 1.028 MB/1.028 MB
---&gt; 5d46a9337dfe
Removing intermediate container d38191e8b1ff
Step 8/10 : VOLUME /data/mysql
---&gt; Running in 5c18e8b76af2
---&gt; 2d1ee498340b
Removing intermediate container 5c18e8b76af2
Step 9/10 : EXPOSE 8080:80/tcp
---&gt; Running in 8c32c08cdb78
---&gt; 17700871c846
Removing intermediate container 8c32c08cdb78
Step 10/10 : RUN cd ./src &amp;&amp;   tar -xf ${WEB_SERVER_PACKAGE}
---&gt; Running in 555b43cc59db
---&gt; 21973fc25ad4
Removing intermediate container 555b43cc59db
Successfully built 21973fc25ad4
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证:已经执行了解压命令</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web1 -P --rm -it busyboxhttpd:v0.7 ls /usr/local/src
nginx-1.15.8
</pre>
</div>
<p>  </p>
<h2><strong>11<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">CMD</span></strong></h2>
<h3><strong>11.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px"><strong><span style="font-family: 微软雅黑">类似于</span>RUN<span style="font-family: 微软雅黑">指令</span></strong><span style="font-family: 微软雅黑">,</span>CMD<span style="font-family: 微软雅黑">指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同</span></li>
<li style="margin-left: 30px">&nbsp;<strong>RUN<span style="font-family: 微软雅黑">指令运行于映像文件</span></strong><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 微软雅黑">构建</span></strong></span><strong><span style="font-family: 微软雅黑">过程</span></strong><span style="font-family: 微软雅黑">中,而</span><strong>CMD<span style="font-family: 微软雅黑">指令运行于基于</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">构建出的新映像文件</span></strong><span style="color: rgba(255, 0, 0, 1)"><strong><span style="font-family: 微软雅黑">启动</span></strong></span><strong><span style="font-family: 微软雅黑">一个容器时</span></strong></li>
<li style="margin-left: 30px">&nbsp;CMD<span style="font-family: 微软雅黑">指令的首要</span><strong><span style="font-family: 微软雅黑">目的在于为启动的容器指定默认要运行的程序</span></strong><span style="font-family: 微软雅黑">,且其运行结束后,容器也将终止;不过,</span>CMD<span style="font-family: 微软雅黑">指定的命令其可以被</span><span style="font-family: Arial">docker run</span><span style="font-family: 微软雅黑">的命令行选项所覆盖</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">在</span>Dockerfile<span style="font-family: 微软雅黑">中可以存在</span><strong><span style="font-family: 微软雅黑">多个</span>CMD<span style="font-family: 微软雅黑">指令,但仅最后一个会生效</span></strong></li>
</ul>
<p>&nbsp;</p>
<h3><strong>11.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">CMD &lt;command&gt;或
CMD [“&lt;executable&gt;",“&lt;param1&gt;","&lt;param2&gt;"]或
CMD ["&lt;param1&gt;","&lt;param2&gt;"]</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">前两种语法格式的意义同</span>RUN</li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">第三种则用于为</span>ENTRYPOINT<span style="font-family: 微软雅黑">指令提供默认参数</span></li>
<li style="margin-left: 30px">&nbsp;json<span style="font-family: 微软雅黑">数组中,要使用</span><strong><span style="font-family: 微软雅黑">双引号</span></strong><span style="font-family: 微软雅黑">,单引号会出错</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>11.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busybox
LABEL maintainer="Along &lt;along@along.com&gt;" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html"

RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp; \
    echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html

CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v1.1 ./
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM busybox
---&gt; 758ec7f3a1ee
Step 2/5 : LABEL maintainer "Along &lt;along@along.com&gt;" app "httpd"
---&gt; Using cache
---&gt; ec064f9da09a
Step 3/5 : ENV WEB_DOC_ROOT "/data/web/html"
---&gt; Using cache
---&gt; fedfecef57c8
Step 4/5 : RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp;   echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html
---&gt; Running in a9b9f66db1fd
---&gt; 7ab194ffda82
Removing intermediate container a9b9f66db1fd
Step 5/5 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
---&gt; Running in ecb0430965d0
---&gt; 3ec2f9b160b7
Removing intermediate container ecb0430965d0
Successfully built 3ec2f9b160b7
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证,</span><span style="font-family: Arial">httpd</span><span style="font-family: 微软雅黑">正常运行</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web2 --rm -d busyboxhttpd:v1.1
20aa07198943887db51173e245392f75e3654525cb32242f2b04f0b3e007e47d
# docker inspect -f {{.NetworkSettings.IPAddress}} web2
172.17.0.2
# curl 172.17.0.2
&lt;h1&gt;Busybox httpd server&lt;/h1&gt;
--- 也可以使用exec 进入web2容器内进行验证
# docker exec -it web2 /bin/sh
/ # ps
PID   USER   TIMECOMMAND
    1 root      0:00 /bin/httpd -f -h /data/web/html
    5 root      0:00 /bin/sh
    9 root      0:00 ps
/ # printenv
WEB_DOC_ROOT=/data/web/html
/ # exit
--- 使用CMD定义的命令,在启动容器时,会被后面追加的指令覆盖;与下面ENTRYPOINT 指令对比
# docker kill web2
web2
# docker run --name web2 --rm busyboxhttpd:v1.1 ls /
bin
data
dev
etc
# curl 172.17.0.2被ls /覆盖,所以没有执行httpd服务
</pre>
</div>
<p>  </p>
<h2><strong>12<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ENTRYPOINT</span></strong></h2>
<h3><strong>12.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<strong><span style="font-family: 微软雅黑">类似</span>CMD</strong><span style="font-family: 微软雅黑">指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">与</span>CMD<span style="font-family: 微软雅黑">不同的是,由</span><span style="font-family: Arial">ENTRYPOINT</span><span style="font-family: 微软雅黑">启动的程序</span><strong><span style="font-family: 微软雅黑">不会被</span>docker&nbsp;run<span style="font-family: 微软雅黑">命令行指定的参数所覆盖</span></strong><span style="font-family: 微软雅黑">,而且,</span><strong><span style="font-family: 微软雅黑">这些命令行参数会被当作参数传递给</span>ENTRYPOINT<span style="font-family: 微软雅黑">指定指定的程序</span></strong></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">不过,</span>docker&nbsp;run<span style="font-family: 微软雅黑">命令的 </span><span style="font-family: Arial">--entrypoint</span><span style="font-family: 微软雅黑">选项的参数可覆盖</span><span style="font-family: Arial">ENTRYPOINT</span><span style="font-family: 微软雅黑">指令指定的程序</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>12.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">ENTR YPOINT &lt;command&gt;
ENTRYPOINT ["&lt;executable&gt;", "&lt;param1&gt;", "&lt;param2&gt;"]</pre>
</div>
<p><span style="font-family: 微软雅黑">注:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;docker&nbsp;run<span style="font-family: 微软雅黑">命令传入的命令参数会覆盖</span><span style="font-family: Arial">CMD</span><span style="font-family: 微软雅黑">指令的内容并且附加到</span><span style="font-family: Arial">ENTRYPOINT</span><span style="font-family: 微软雅黑">命令最后做为其参数使用</span></li>
<li style="margin-left: 30px">&nbsp;Dockerfile<span style="font-family: 微软雅黑">文件中也可以存在多个</span><span style="font-family: Arial">ENTRYPOINT</span><span style="font-family: 微软雅黑">指令,但仅有最后一个会生效</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>12.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busybox
LABEL maintainer="Along &lt;along@along.com&gt;" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html"

RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp; \
    echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html

ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v1.2 ./
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM busybox
---&gt; 758ec7f3a1ee
Step 2/5 : LABEL maintainer "Along &lt;along@along.com&gt;" app "httpd"
---&gt; Using cache
---&gt; ec064f9da09a
Step 3/5 : ENV WEB_DOC_ROOT "/data/web/html"
---&gt; Using cache
---&gt; fedfecef57c8
Step 4/5 : RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp;   echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html
---&gt; Using cache
---&gt; 7ab194ffda82
Step 5/5 : ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
---&gt; Running in aebee4cd3d4f
---&gt; 2e3853256eab
Removing intermediate container aebee4cd3d4f
Successfully built 2e3853256eab
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web2 --rm busyboxhttpd:v1.2 ls /
发现是不会执行ls / 这个命令;仍然执行的是ENTRYPOINT中设置的命令;与上面CMD 指令对比;
# curl 172.17.0.2   #httpd服务仍然执行,没有被ls / 指令覆盖
&lt;h1&gt;Busybox httpd server&lt;/h1&gt;
</pre>
</div>
<p>  </p>
<h2><strong>13<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">HEALTHCHECK</span><span style="font-family: 微软雅黑"><br></span></strong></h2>
<h3><strong>13.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;HEALTHCHECK<span style="font-family: 微软雅黑">指令告诉</span><span style="font-family: Arial">Docker</span><span style="font-family: 微软雅黑">如何测试容器以检查它是否仍在工作。</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">即使服务器进程仍在运行,这也可以检测出陷入无限循环且无法处理新连接的</span>Web<span style="font-family: 微软雅黑">服务器等情况。</span></li>






















</ul>
<p>&nbsp;</p>
<h3><strong>13.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<p>&nbsp;</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">HEALTHCHECK CMD command (通过在容器内运行命令来检查容器运行状况)
HEALTHCHECK NONE (禁用从基础映像继承的任何运行状况检查)</pre>
</div>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)</span><span style="font-family: Arial">OPTIONS </span><span style="font-family: 微软雅黑">选项:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;--interval=DURATION (default: 30s)<span style="font-family: 微软雅黑">:每隔多长时间探测一次,默认</span><span style="font-family: Arial">30</span><span style="font-family: 微软雅黑">秒</span></li>
<li style="margin-left: 30px">&nbsp;-- timeout= DURATION (default: 30s)<span style="font-family: 微软雅黑">:服务响应超时时长,默认</span><span style="font-family: Arial">30</span><span style="font-family: 微软雅黑">秒</span></li>
<li style="margin-left: 30px">&nbsp;--start-period= DURATION (default: 0s)<span style="font-family: 微软雅黑">:服务启动多久后开始探测,默认</span><span style="font-family: Arial">0</span><span style="font-family: 微软雅黑">秒</span></li>
<li style="margin-left: 30px">&nbsp;--retries=N (default: 3)<span style="font-family: 微软雅黑">:认为检测失败几次为宕机,默认</span><span style="font-family: Arial">3</span><span style="font-family: 微软雅黑">次</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)返回值:</span></p>
<ul>
<li style="margin-left: 30px">&nbsp;0<span style="font-family: 微软雅黑">:容器成功是健康的,随时可以使用</span></li>
<li style="margin-left: 30px">&nbsp;1<span style="font-family: 微软雅黑">:不健康的容器无法正常工作</span></li>
<li style="margin-left: 30px">&nbsp;2<span style="font-family: 微软雅黑">:保留不使用此退出代码</span></li>
</ul>
<p>&nbsp;</p>
<h3>13.3 <span style="font-family: 微软雅黑">示例</span></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写</span><span style="font-family: Arial">dockerfile</span><span style="font-family: 微软雅黑">文件</span></p>
<p><span style="font-family: 微软雅黑">检测</span>web2<span style="font-family: 微软雅黑">容器的</span><span style="font-family: Arial">10080</span><span style="font-family: 微软雅黑">端口(其实打开的是</span><span style="font-family: Arial">80</span><span style="font-family: 微软雅黑">端口,</span><span style="font-family: Arial">10080</span><span style="font-family: 微软雅黑">并没有,所有会检测失败)</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busybox
LABEL maintainer="Along &lt;along@along.com&gt;" app="httpd"

ENV WEB_DOC_ROOT="/data/web/html"

RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp; \
    echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html

CMD /bin/httpd -f -h ${WEB_DOC_ROOT}

HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:10080/
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)使用</span><span style="font-family: Arial">build </span><span style="font-family: 微软雅黑">制作镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v1.3 ./
Sending build context to Docker daemon2.048kB
Step 1/6 : FROM busybox
---&gt; 3a093384ac30
Step 2/6 : LABEL maintainer="Along &lt;along@along.com&gt;" app="httpd"
---&gt; Using cache
---&gt; 164a0af1b5dc
Step 3/6 : ENV WEB_DOC_ROOT="/data/web/html"
---&gt; Using cache
---&gt; 930023fca80b
Step 4/6 : RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp;   echo "&lt;h1&gt;Busybox httpd server&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html
---&gt; Using cache
---&gt; 1df364fca443
Step 5/6 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
---&gt; Running in 671f9491d0c3
Removing intermediate container 671f9491d0c3
---&gt; 71451fa629e9
Step 6/6 : HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
---&gt; Running in 474395f265da
Removing intermediate container 474395f265da
---&gt; 757ab550ea25
Successfully built 757ab550ea25
Successfully tagged busyboxhttpd:v1.3
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于此新建镜像运行容器,进行验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web2 --rm -d busyboxhttpd:v1.3
7060a6717e77acecd683a6b05332ab7cec128b836e6aa2d7d5ce8fb1b38b7fd6
--- 容器刚创建,还没检测完时,容器还是health 健康状态
# docker ps
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                            PORTS               NAMES
7060a6717e77      busyboxhttpd:v1.3   "/bin/sh -c '/bin/ht…"   3 seconds ago       Up 3 seconds (health: starting)                     web2
--- 30s 检测完时,没有检测到10080端口,容器变为unhealthy不健康状态
# docker ps
CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
7060a6717e77      busyboxhttpd:v1.3   "/bin/sh -c '/bin/ht…"   30 seconds ago      Up 30 seconds (unhealthy)                     web2
</pre>
</div>
<p>  </p>
<h2><strong>14<span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">ONBUILD</span></strong></h2>
<h3><strong>14.1 <span style="font-family: 微软雅黑">介绍</span></strong></h3>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于在</span>Dockerfile<span style="font-family: 微软雅黑">中</span><strong><span style="font-family: 微软雅黑">定义一个触发器</span></strong></li>
<li style="margin-left: 30px">&nbsp;Dockerfile<span style="font-family: 微软雅黑">用于</span><span style="font-family: Arial">build</span><span style="font-family: 微软雅黑">映像文件,此映像文件亦可作为</span><span style="font-family: Arial">base image</span><span style="font-family: 微软雅黑">被另一个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">用作</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">指令的参数,并以之构建新的映像文件</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">在</span><strong><span style="font-family: 微软雅黑">后面的这个</span>Dockerfile<span style="font-family: 微软雅黑">中的</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">指令在</span><span style="font-family: Arial">build</span><span style="font-family: 微软雅黑">过程中被执行</span></strong><span style="font-family: 微软雅黑">时,将</span><strong><span style="font-family: 微软雅黑">会</span>“<span style="font-family: 微软雅黑">触发</span><span style="font-family: Arial">”</span></strong><span style="font-family: 微软雅黑">创建其</span>base image<span style="font-family: 微软雅黑">的</span><strong>Dockerfile<span style="font-family: 微软雅黑">文件中的</span><span style="font-family: Arial">ONBUILD</span><span style="font-family: 微软雅黑">指令</span></strong><span style="font-family: 微软雅黑">定义的触发器</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>14.2 <span style="font-family: 微软雅黑">语法</span></strong></h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">ONBUILD &lt; Instruction&gt;</pre>
</div>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">尽管任何指令都可注册成为触发器指令,但</span>ONBUILD<span style="font-family: 微软雅黑">不能自我嵌套,且不会触发</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">和</span><span style="font-family: Arial">MAINTAINER</span><span style="font-family: 微软雅黑">指令</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">使用包含</span>ONBUILD<span style="font-family: 微软雅黑">指令的</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">构建的镜像应该使用特殊的标签,例如</span><span style="font-family: Arial">ruby:2.0-onbuil</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">在</span>ONBUILD<span style="font-family: 微软雅黑">指令中使用</span><span style="font-family: Arial">ADD</span><span style="font-family: 微软雅黑">或</span><span style="font-family: Arial">COPY</span><span style="font-family: 微软雅黑">指令应该格外小心,因为新构建过程的上下文在缺少指定的源文件时会失败</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>14.3 <span style="font-family: 微软雅黑">示例</span></strong></h3>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)编写第一个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件,准备作为第二个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件的</span><span style="font-family: Arial">FROM</span><span style="font-family: 微软雅黑">基础镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busybox
MAINTAINER "Along &lt;along@along.com&gt;"

ENV WEB_DOC_ROOT="/data/web/html"

RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp; \
    echo "&lt;h1&gt;Busybox httpd server1&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html

ONBUILD RUN echo "&lt;h1&gt;Busybox httpd server2&lt;/h1&gt;" &gt;&gt; /data/web/html/index.html
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)编写第</span><span style="font-family: Arial">2</span><span style="font-family: 微软雅黑">个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件,</span><span style="font-family: Arial">FROM </span><span style="font-family: 微软雅黑">基于第</span><span style="font-family: Arial">1</span><span style="font-family: 微软雅黑">个</span><span style="font-family: Arial">Dockerfile</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busyboxhttpd:v2.1</pre>
</div>
<p>&nbsp;</p>
<p><span style="font-family: 微软雅黑">(</span>3<span style="font-family: 微软雅黑">)基于</span><span style="font-family: Arial">2</span><span style="font-family: 微软雅黑">个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件新建镜像,并运行容器,进行验证</span></p>
<p>① <span style="font-family: 微软雅黑">基于第</span><span style="font-family: Arial">1</span><span style="font-family: 微软雅黑">个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件新建镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v2.1 ./
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM busybox
---&gt; 758ec7f3a1ee
Step 2/5 : MAINTAINER "Along &lt;along@along.com&gt;"
---&gt; Using cache
---&gt; 5d2cda1631d7
Step 3/5 : ENV WEB_DOC_ROOT "/data/web/html"
---&gt; Running in 210437fc0778
---&gt; 0a3becd99802
Removing intermediate container 210437fc0778
Step 4/5 : RUN mkdir -p ${WEB_DOC_ROOT} &amp;&amp;   echo "&lt;h1&gt;Busybox httpd server1&lt;/h1&gt;" &gt; ${WEB_DOC_ROOT}/index.html &amp;&amp;   /bin/chown nobody ${WEB_DOC_ROOT}/index.html /bin/httpd
---&gt; Running in e370d8843211
---&gt; 4c1f59085f78
Removing intermediate container e370d8843211
Step 5/5 : ONBUILD run echo "&lt;h1&gt;Busybox httpd server2&lt;/h1&gt;" &gt;&gt; /data/web/html/index.html
---&gt; Running in f47258319e1d
---&gt; 232b1c393634
Removing intermediate container f47258319e1d
Successfully built 232b1c393634
</pre>
</div>
<p>  </p>
<p>② <span style="font-family: 微软雅黑">基于第</span><span style="font-family: Arial">2</span><span style="font-family: 微软雅黑">个</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">文件新建镜像</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker build -t busyboxhttpd:v2.2 ./
Sending build context to Docker daemon 2.467 MB
Step 1/1 : FROM busyboxhttpd:v2.1
# Executing 1 build trigger...
Step 1/1 : RUN echo "&lt;h1&gt;Busybox httpd server2&lt;/h1&gt;" &gt;&gt; /data/web/html/index.html
---&gt; Using cache
---&gt; a2a6ae382228
Successfully built a2a6ae382228
</pre>
</div>
<p>  </p>
<p>③ <span style="font-family: 微软雅黑">基于二个新镜像启动容器验证</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># docker run --name web2 --rm busyboxhttpd:v2.1 cat /data/web/html/index.html
&lt;h1&gt;Busybox httpd server1&lt;/h1&gt;
--- 证明ONBUILD指令,只在第2个Dockerfile文件中生效
# docker run --name web2 --rm busyboxhttpd:v2.2 cat /data/web/html/index.html
&lt;h1&gt;Busybox httpd server1&lt;/h1&gt;
&lt;h1&gt;Busybox httpd server2&lt;/h1&gt;</pre>
</div>
<p>&nbsp;</p>
<h2><strong>15<span style="font-family: 微软雅黑">、不常用的 </span><span style="font-family: Arial">dockerfile </span><span style="font-family: 微软雅黑">指令</span></strong></h2>
<h3><strong>15.1 USER</strong></h3>
<h4><strong>15.1.1 <span style="font-family: 微软雅黑">介绍</span></strong></h4>
<ul>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">用于指定运行</span>image<span style="font-family: 微软雅黑">时的或运行</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">中任何</span><span style="font-family: Arial">RUN</span><span style="font-family: 微软雅黑">、</span><span style="font-family: Arial">CMD</span><span style="font-family: 微软雅黑">或</span><span style="font-family: Arial">EntRyPoInT</span><span style="font-family: 微软雅黑">指令指定的程序时的用户名或</span><span style="font-family: Arial">UID</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">默认情况下,</span>container<span style="font-family: 微软雅黑">的运行身份为</span><span style="font-family: Arial">root</span><span style="font-family: 微软雅黑">用户</span></li>
</ul>
<p>&nbsp;</p>
<h4><strong>15.1.2 <span style="font-family: 微软雅黑">格式</span></strong></h4>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">USER &lt;UID&gt;| &lt;U JserName &gt;</pre>
</div>
<p><span style="font-family: 微软雅黑">  需要注意的是,</span>&lt;UID&gt;<span style="font-family: 微软雅黑">可以为任意数字,但实践中其必须为</span><span style="font-family: Arial">/etc/ passwd</span><span style="font-family: 微软雅黑">中某用户的有效</span><span style="font-family: Arial">UID,</span><span style="font-family: 微软雅黑">否则,</span><span style="font-family: Arial">docker run</span><span style="font-family: 微软雅黑">命令将运行失败</span></p>
<p>&nbsp;</p>
<h3><strong>15.2 ARG</strong></h3>
<h4><strong>15.2.1 <span style="font-family: 微软雅黑">介绍</span></strong></h4>
<ul>
<li style="margin-left: 30px">&nbsp;ARG<span style="font-family: 微软雅黑">指令类似</span><span style="font-family: Arial">ENV</span><span style="font-family: 微软雅黑">,定义了一个变量;区别于</span><span style="font-family: Arial">ENV</span><span style="font-family: 微软雅黑">:用户可以在构建时</span><span style="font-family: Arial">docker build --build-arg &lt;varname&gt; = &lt;value&gt; </span><span style="font-family: 微软雅黑">进行对变量的修改;</span><span style="font-family: Arial">ENV</span><span style="font-family: 微软雅黑">不可以;</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">如果用户指定了未在</span>Dockerfile<span style="font-family: 微软雅黑">中定义的构建参数,那么构建输出警告。</span></li>
</ul>
<p>&nbsp;</p>
<h4><strong>15.2.2 <span style="font-family: 微软雅黑">格式</span></strong></h4>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">ARG &lt;name&gt;[= &lt;default value&gt;]</pre>
</div>
<p>Dockerfile<span style="font-family: 微软雅黑">可以包含一个或多个</span><span style="font-family: Arial">ARG</span><span style="font-family: 微软雅黑">指令</span></p>
<p>&nbsp;</p>
<p><strong>15.2.2 <span style="font-family: 微软雅黑">示例</span></strong></p>
<p><span style="font-family: 微软雅黑">(</span>1<span style="font-family: 微软雅黑">)在</span><span style="font-family: Arial">dockerfile </span><span style="font-family: 微软雅黑">中定义</span><span style="font-family: Arial">ARG</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">FROM busybox:latest
ARG author="Along &lt;along@along.com&gt;"
MAINTAINER $ARG
</pre>
</div>
<p>  </p>
<p><span style="font-family: 微软雅黑">(</span>2<span style="font-family: 微软雅黑">)构建此时镜像时,修改此</span><span style="font-family: Arial">age</span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">docker build --build-arg author="Tom &lt;tom@tom.com&gt;" -t test:v0.1 ./</pre>
</div>
<p>&nbsp;</p>
<h3><strong>15.3 SHELL</strong></h3>
<h4><strong>15.3.1 <span style="font-family: 微软雅黑">介绍</span></strong></h4>
<ul>
<li style="margin-left: 30px">&nbsp;SHELL<span style="font-family: 微软雅黑">指令允许覆盖用于</span><span style="font-family: Arial">shell</span><span style="font-family: 微软雅黑">命令形式的默认</span><span style="font-family: Arial">shell</span><span style="font-family: 微软雅黑">。</span></li>
<li style="margin-left: 30px">&nbsp;Linux<span style="font-family: 微软雅黑">上的默认</span><span style="font-family: Arial">shell</span><span style="font-family: 微软雅黑">是</span><span style="font-family: Arial">[“/ bin / sh”</span><span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">“c”]</span><span style="font-family: 微软雅黑">,在</span><span style="font-family: Arial">Windows</span><span style="font-family: 微软雅黑">上是</span><span style="font-family: Arial">[“cmd”</span><span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">“/ S”</span><span style="font-family: 微软雅黑">,</span><span style="font-family: Arial">“/ C”]</span></li>
<li style="margin-left: 30px">&nbsp;SHELL<span style="font-family: 微软雅黑">指令必须以</span><span style="font-family: Arial">JSON</span><span style="font-family: 微软雅黑">格式写入</span><span style="font-family: Arial">Dockerfile</span><span style="font-family: 微软雅黑">。</span></li>
</ul>
<p>&nbsp;</p>
<h4><strong>15.3.2 <span style="font-family: 微软雅黑">语法</span></strong></h4>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">SHELL ["executable", "parameters"]</pre>
</div>
<ul>
<li style="margin-left: 30px">&nbsp;SHELL<span style="font-family: 微软雅黑">指令可以多次出现。</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">每个</span>SHELL<span style="font-family: 微软雅黑">指令都会覆盖所有先前的</span><span style="font-family: Arial">SHELL</span><span style="font-family: 微软雅黑">指令,并影响所有后续指令。</span></li>
</ul>
<p>&nbsp;</p>
<h3><strong>15.4 STOPSIGNAL</strong></h3>
<h4>15.4.1 <span style="font-family: 微软雅黑">介绍</span></h4>
<ul>
<li style="margin-left: 30px">&nbsp;STOPSIGNAL<span style="font-family: 微软雅黑">指令设置将发送到容器出口的系统调用信号。</span></li>
<li style="margin-left: 30px">&nbsp;<span style="font-family: 微软雅黑">此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如</span>9<span style="font-family: 微软雅黑">,或者</span><span style="font-family: Arial">SIGNAME</span><span style="font-family: 微软雅黑">格式的信号名,例如</span><span style="font-family: Arial">SIGKILL</span><span style="font-family: 微软雅黑">。</span></li>
</ul>
<p>&nbsp;</p>
<h4>15.4.2 <span style="font-family: 微软雅黑">语法</span></h4>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">STOPSIGNAL signal
</pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p><b>
如果您认为这篇文章还不错或者有所收获,您可以通过<big><font color="red">右边的“打赏”功能</font></big> 打赏我一杯咖啡【物质支持】,也可以点击右下角的<big><font color="red">【赞】</font></big>按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
</b></p>
<div style="border: medium double rgb(0,0,5); background: #FFFF93; color: #0; font-size: smail">
<p><b>&nbsp;&nbsp;作者:along阿龙
<br>
&nbsp;&nbsp;出处:http://www.cnblogs.com/along21/
<br>
&nbsp;&nbsp;简介:每天都在进步,每周都在总结,你的一个<big><font color="red">点赞</font></big>,一句<big><font color="red">留言</font></big>,就可以让博主开心一笑,充满动力!
<br>
&nbsp;&nbsp;版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
</b></p>
</div>
<p><b><big>已将所有赞助者统一放到单独页面!签名处只保留最近10条赞助记录!查看赞助者列表</big>
</b></p>
<div style="border: medium double rgb(0,0,5); background: color: #0; font-size: smail">
<table border="1">
<tbody><tr>
<th bgcolor="#CCFFFF" colspan="3">衷心感谢打赏者的厚爱与支持!也感谢点赞和评论的园友的支持!</th>
</tr>
<tr>
<th bgcolor="#CCFFFF">打赏者</th>
<th bgcolor="#CCFFFF">打赏金额</th>
<th bgcolor="#CCFFFF">打赏日期</th>
</tr>
<tr>
<td>微信:*光</td>
<td>10.00</td>
<td>2019-04-14</td>
</tr>
<tr>
<td>微信:小罗</td>
<td>10.00</td>
<td>2019-03-25</td>
</tr>
<tr>
<td>微信:*光</td>
<td>5.00</td>
<td>2019-03-24</td>
</tr>
<tr>
<td>微信:*子</td>
<td>10.00</td>
<td>2019-03-21</td>
</tr>
<tr>
<td>微信:云</td>
<td>5.00</td>
<td>2019-03-19</td>
</tr>
<tr>
<td>支付宝:马伏硅</td>
<td>5.00</td>
<td>2019-03-08</td>
</tr>
<tr>
<td>支付宝:唯一</td>
<td>10.00</td>
<td>2019-02-02</td>
</tr>
<tr>
<td>微信:*亮</td>
<td>5.00</td>
<td>2018-12-28</td>
</tr>
<tr>
<td>微信:流金岁月1978</td>
<td>10.00</td>
<td>2018-11-16</td>
</tr>
<tr>
<td>微信:,别输给自己,</td>
<td>20.00</td>
<td>2018-11-06</td>
</tr>
</tbody></table>
</div><br><br>
来源:https://www.cnblogs.com/along21/p/10243761.html
頁: [1]
查看完整版本: Docker系列07—Dockerfile 详解