Dockerfile 中的 CMD 与 ENTRYPOINT

论坛 期权论坛     
选择匿名的用户   2021-6-2 19:01   116   0
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">CMD 和 ENTRYPOINT 指令都是用来指定容器启动时运行的命令。</span><br style="margin:0px;padding:0px;"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">单从功能上来看,这两个命令几乎是重复的。单独使用其中的一个就可以实现绝大多数的用例。但是既然 doker 同时提供了它们,为了在使用中不至于混淆,本文试图把它们的用法理清楚。</span></p>
<h1 style="margin-top:10px;margin-bottom:10px;padding:0px;line-height:1.5;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:18pt;">exec 模式和 shell 模式<br style="margin:0px;padding:0px;"></span></h1>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">CMD 和 ENTRYPOINT 指令都支持 exec 模式和 shell 模式的写法,所以要理解 CMD 和 ENTRYPOINT 指令的用法,就得先区分 exec 模式和 shell 模式。这两种模式主要用来指定容器中的不同进程为 1 号进程。了解 linux 的朋友应该清楚 1 号进程在系统中的重要地位。笔者也在《<a href="http://www.cnblogs.com/sparkdev/p/7598590.html" style="margin:0px;padding:0px;color:#000000;text-decoration:underline;">在 docker 容器中捕获信号</a>》一文中介绍过 1 号进程对容器中信号处理的重要性,感兴趣的朋友可以移步<a href="http://www.cnblogs.com/sparkdev/p/7598590.html" style="margin:0px;padding:0px;color:#000000;text-decoration:underline;">这里</a>进行了解。下面我们通过 CMD 指令来学习 exec 模式和 shell 模式的特点。</span></p>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-size:18px;"><span style="margin:0px;padding:0px;"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;">exec 模式</span></span></span></p>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">使用 exec 模式时,容器中的任务进程就是容器内的 1 号进程,看下面的例子:</span></p>
<div class="cnblogs_code" style="margin:5px 0px;padding:5px;background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);color:rgb(0,0,0);text-align:left;font-family:&#39;Courier New&#39;;font-size:12px;">
<pre style="margin-bottom:0px;padding-right:0px;padding-left:0px;white-space:pre-wrap;font-family:&#39;Courier New&#39;;"><span style="margin:0px;padding:0px;color:rgb(0,128,128);line-height:1.5;">FROM</span><span style="margin:0px;padding:0px;line-height:1.5;"> ubuntu
</span><span style="margin:0px;padding:0px;color:rgb(0,128,128);line-height:1.5;">CMD</span> [ &#34;top&#34; ]</pre>
</div>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">把上面的代码保存到 test1 目录的 Dockerfile 中,然后进入 test1 目录构建镜像并启动一个容器:</span></p>
<div class="cnblogs_code" style="margin:5px 0px;padding:5px;background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);color:rgb(0,0,0);text-align:left;font-family:&#39;Courier New&#39;;font-size:12px;">
<pre style="margin-bottom:0px;padding-right:0px;padding-left:0px;white-space:pre-wrap;font-family:&#39;Courier New&#39;;">$ docker build -<span style="margin:0px;padding:0px;line-height:1.5;">t test1 .
$ docker run </span>-idt --name testcon test1</pre>
</div>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;">然后查看容器中的进程 ID:</span></p>
<div class="cnblogs_code" style="margin:5px 0px;padding:5px;background-color:rgb(245,245,245);border:1px solid rgb(204,204,204);color:rgb(0,0,0);text-align:left;font-family:&#39;Courier New&#39;;font-size:12px;">
<pre style="margin-bottom:0px;padding-right:0px;padding-left:0px;white-space:pre-wrap;font-family:&#39;Courier New&#39;;">$ docker exec testcon <span style="margin:0px;padding:0px;color:rgb(0,0,255);line-height:1.5;">ps</span> aux</pre>
</div>
<p style="margin:10px auto;color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14px;text-align:left;background-color:rgb(238,238,238);"><span style="margin:0px;padding:0px;font-family:&#39;Microsoft YaHei&#39;;font-size:15px;"><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliy
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP