017、RUN、CMD、ENTRYPOINT (2019-01-08 周二)

参考https://www.cnblogs.com/CloudMan6/p/6875834.html

RUN CMD ENTRYPOINT 这三个Dockerfile指令看上去很类似,很容易混淆。

简单的说:

RUN 执行命令并创建新的镜像层,经常用于安装软件

CMD 设置容器启动后默认执行的命令机器参数,但CMD能够被 docker run 后面跟的命令行参数替换

ENTRYPOINT 配置容器启动时运行的命令

shell 和exex 格式

有shell和exec两种方式可以指定 RUN CMD ENTRYPOINT 要运行的命令,两者在使用上有细微的区别

shell 格式:

<instruction> <command>

例如:

RUN apt-get install -y python3

CMD echo "Hello world"

ENTRYPOINT echo "Hello world"

当指令执行时,shell格式底层会调用 /bin/sh -c <command>

[email protected]:~/017# cat Dockerfile

FROM busybox

ENV name www1707

ENTRYPOINT echo "Hello $name"

[email protected]:~/017# docker build -t test017 .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM busybox

---> 3a093384ac30

Step 2/3 : ENV name www1707

---> Running in e43df73f1151

Removing intermediate container e43df73f1151

---> 973f9b8b29b7

Step 3/3 : ENTRYPOINT echo "Hello $name"

---> Running in 5efc3b5b3053

Removing intermediate container 5efc3b5b3053

---> c9321b834dbb

Successfully built c9321b834dbb

Successfully tagged test017:latest

[email protected]:~/017# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

test017             latest              c9321b834dbb        6 seconds ago       1.2MB

myimage             latest              c67728621bdd        33 hours ago        1.2MB

busybox             latest              3a093384ac30        7 days ago          1.2MB

[email protected]:~/017# docker run test017

Hello www1707

exec格式:

<instruction> ["executable","param1","param2",...]

例如:

RUN ["apt-get","install","python3"]

CMD ["/bin/echo","Hello world"]

ENTRYPOINT ["/bin/echo","Hello world"]

当指令执行时,会直接调用command,不会被shell解析

[email protected]:~/017# cat Dockerfile

FROM busybox

ENV name www1707

ENTRYPOINT ["/bin/echo","Hello,$name"]

[email protected]:~/017# docker build -t test-017 .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM busybox

---> 3a093384ac30

Step 2/3 : ENV name www1707

---> Running in 6a2a8dcbd2ab

Removing intermediate container 6a2a8dcbd2ab

---> 026f3f3c154e

Step 3/3 : ENTRYPOINT ["/bin/echo","Hello,$name"]

---> Running in 92c90db5bbc3

Removing intermediate container 92c90db5bbc3

---> 1f01346313b5

Successfully built 1f01346313b5

Successfully tagged test-017:latest

[email protected]:~/017# docker run test-017

Hello,$name

[email protected]:~/017# cat Dockerfile

FROM busybox

ENV name www1707

ENTRYPOINT ["/bin/sh","-c","echo Hello,$name"]

[email protected]:~/017# docker build -t test-017 .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM busybox

---> 3a093384ac30

Step 2/3 : ENV name www1707

---> Using cache

---> 026f3f3c154e

Step 3/3 : ENTRYPOINT ["/bin/sh","-c","echo Hello,$name"]

---> Running in 459792a5b117

Removing intermediate container 459792a5b117

---> d163360f72c5

Successfully built d163360f72c5

Successfully tagged test-017:latest

[email protected]:~/017# docker run test-017

Hello,www1707

CMD 和 ENTYRPOINT 推荐使用exec格式,因为指令的可读性更强,更容易理解。

RUN

RUN 使用两种格式都可以,但是RUN一般用来安装应用和软件包,推荐shell格式

RUN apt-get update && apt-get install -y vim wget

先执行update 保证后面安装的软件版本是最新的,要不然会可能会安装一个早期的版本或者直接安装失败

CMD

CMD支持三种格式

1、exec格式  CMD ["executable","param1","param2"]

这是CMD推荐的格式

2、CMD ["param1","param2"]

这是为ENTRYPOINT  提供额外参数时的格式,此时 ENTRYPOINT 必须是exec格式

3、CMD command param1 param2

这是shell格式

第二种格式 CMD ["param1","param2"] 要与 exec格式的 ENTRYPOINT 指令配合使用,其用户是为ENTRYPOINT设置默认参数。

当docker run 后面有参数时,CMD指令将会被忽略

[email protected]:~/017# cat Dockerfile

FROM busybox

CMD echo "Hello world"

[email protected]:~/017# docker build -t test-017 .

Sending build context to Docker daemon  2.048kB

Step 1/2 : FROM busybox

---> 3a093384ac30

Step 2/2 : CMD echo "Hello world"

---> Running in 15bd85e76424

Removing intermediate container 15bd85e76424

---> 13e99c60b00d

Successfully built 13e99c60b00d

Successfully tagged test-017:latest

[email protected]:~/017# docker run test-017

Hello world

[email protected]:~/017# docker run -it test-017

Hello world

[email protected]:~/017# docker run -it test-017 /bin/sh

/ #

/ # exit

[email protected]:~/017#

ENTRYPOINT

该指令可以让容器以应用程序或者服务运行。ENTYRPOINT和CMD看上去很像,他们都可以指定要执行的命令及参数。但是ENTYRPOINT不会被忽略,一定会被执行,即使docker run 后面指定了其他命令。

exec格式--推荐格式

ENTYRPOINT ["executable","param1","param2"]

[email protected]:~/017# cat Dockerfile

FROM busybox

ENTRYPOINT ["/bin/echo","Hello"]

CMD ["world"]

[email protected]:~/017# docker build -t test-017 .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM busybox

---> 3a093384ac30

Step 2/3 : ENTRYPOINT ["/bin/echo","Hello"]

---> Running in 5fca55e81dd9

Removing intermediate container 5fca55e81dd9

---> 60978b547d5d

Step 3/3 : CMD ["world"]

---> Running in b1f9da2b8ecf

Removing intermediate container b1f9da2b8ecf

---> 1957f19e2cb7

Successfully built 1957f19e2cb7

Successfully tagged test-017:latest

[email protected]:~/017# docker run test-017

Hello world

[email protected]:~/017# docker run -it test-017 www1707

Hello www1707

shell格式--该格式会忽略掉CMD和docker run 后面的参数

ENTRYPOINT command param1 param2

[email protected]:~/017# cat Dockerfile

FROM busybox

ENTRYPOINT echo hello

CMD ["world"]

[email protected]:~/017# docker build -t test-017 .

Sending build context to Docker daemon  2.048kB

Step 1/3 : FROM busybox

---> 3a093384ac30

Step 2/3 : ENTRYPOINT echo hello

---> Running in 683c7c95a0bb

Removing intermediate container 683c7c95a0bb

---> 4b76c9e22319

Step 3/3 : CMD ["world"]

---> Running in 3464e96183d6

Removing intermediate container 3464e96183d6

---> d636aed0e6b4

Successfully built d636aed0e6b4

Successfully tagged test-017:latest

[email protected]:~/017# docker run test-017

hello

[email protected]:~/017# docker run -it test-017 www1707

hello

 

最佳实践

1、RUN 指定用来安装应用和软件包

2、ENTRYPOINT用来运行应用或者服务,可以用CMD提供额外的参数,还可以用docker run提供参数或者是替换掉CMD提供的参数

3、CMD可以为容器设置默认的启动命令,也可以用docker run替换掉

原文地址:https://www.cnblogs.com/www1707/p/10247657.html

时间: 2024-10-09 16:02:23

017、RUN、CMD、ENTRYPOINT (2019-01-08 周二)的相关文章

FW: Dockerfile RUN, CMD &amp; ENTRYPOINT

Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. RUN是在building image时会运行的指令, 在Dockerfile中可以写多条RUN指令. CMD和ENTRYPOINT则是在运行container 时会运行的指令, 都只能写一条, 如果写了多条, 则最后一条生效. CMD和ENTRYPOINT的区别是: CMD在运行时会被command覆盖, ENTR

docker CMD ENTRYPOINT 区别

昨天用Dockerfile来启动mongodb的集群,启动参数--replSet死活没执行,最后就决定研究一哈cmd和entrypoint.但是上网看了一些资料个人觉得讲的不好,还是没有说出根本的东西,决定自己研究并且整理一哈. 首先上docker官网:https://docs.docker.com/engine/reference/builder/#cmd 感觉官网关于这两个命令讲的简直不要太清楚. cmd: 这个命令是用来做什么的?下面是官网的答案: The main purpose of

AWS re:Invent(2019.01.09)

时间:2019.01.09地点:北京国际饭店 原文地址:https://www.cnblogs.com/xuefeng1982/p/10335801.html

【谜客帝国】第145届芭比娃娃主擂谜会(2019.01.15)

[谜客帝国]第145届芭比娃娃主擂谜会(2019.01.15) 主持:瓷   计分:默沫 1. 同心十八载,白首居河东(2字2019亚洲杯中国球员)石柯 2. 王朗气极坠地死(3字方位字)骂下马 [注:典据<三国演义>93回,“王朗听罢,气满胸膛,大叫一声,撞死于马下.”] 3. 城头长弓搭白羽(2字宋词人)张翥 4. 重门折屐未曾进(成语)格格不入 [注:重门.折屐,皆为谜格.] 5.“石城古岸头”(2字国家森林公园)圭山 6. 凯撒大帝显露出愤怒(4字<诗经>名句)七月流火 [

【谜客帝国】第146届千江雪主擂谜会(2019.01.30)

 [谜客帝国]第146届千江雪主擂谜会(2019.01.30) 主持:瓷   计分:雪宝 1. 几回驻马观潮起(对人评价语)没主见 2. “他年我若为青帝”(商品连价位2+2)花生一块 [注:面出黄巢<题菊花>,启下句 “报与桃花一处开”] 3. 看我横戈行天下(东北方言)大手 4. 寒梅凋谢扑满衣(对<红楼梦>人物态度)冷落花袭人 5. 挥手拢琴动凡心(诛仙小说人物)玲珑 6. “纵使相逢应不识”(3字猜不出谜原因)面太生 [面出苏轼<江城子 记梦>] 7. 松间小月

2019.01.07 正则表达式

math:数学1.正则:描述一种字符串的表达式,用来匹配字符串 2. <script type="text/javascript">     console.log(Math.E); //E 常数:无限不循环小数,且为超越数:      console.log(Math.PI); //PI 圆周率     console.log(Math.abs(-12)); // abs 绝对值     console.log(Math.ceil(12.3)); //ceil 向上取整

Linux Cmd Tool 系列01—alias

The alias cmd list your current aliases. For example : alias   Use alias to shorten a long cmd in current shell session: alias [name=['command']]   Use unalias to remove the alias , or use "\"(back-slash) before command to disable alias.   Your

网络请求(listview json解析 数据库存储)【周五01.08】

adapter 包 MyBaseAdapter类 1 package com.cp.adapter; 2 3 import java.util.List; 4 5 import android.content.Context; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 import android.widget.BaseAdapter;

2019.01.04|区块链技术头条

今日区块链技术头条 1.最新区块链技术工坊|大白话区块链共识机制算法 2.京东分布式 BaaS 的设计与实践 3.Fabric 网络环境启动过程详解 4.区块链技术在各大高校的教育现状简评 5.比特币诞生十周年之际,反思中本聪创造比特币的意图和愿景 6.从监管角度看2019年的区块链态势 7.带领比特币走向复苏?2019年这5大热点值得关注! 8.以太坊分叉在即,对我们的ETH投资决策有什么影响? 9.关于企业区块链非愚蠢应用的建议 10.从链上数据看以太坊 2018 下半年的挖矿活动 区块链应

2019/09/08最新进展

今日完成的工作如下: 1.继续完善论文: 2.发现仿真数据出错了,原来是公式有个地方出错了... 修改后的公式为: (1)      当t1<=2.5s,v=v2 (2)      当2.7s > t1 >2.5s,v = v2 – ug(t^2)/0.4|t=t1-2.5 (3)      当t1>2.7s,  v’=v2-ug(0.2*0.2)-(v1/(ug)+0.1-2.7)*ug 3.根据公式进行仿真.写一个cpp: #include<bits/stdc++.h&g