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>
root@docker-lab:~/017# cat Dockerfile
FROM busybox
ENV name www1707
ENTRYPOINT echo "Hello $name"
root@docker-lab:~/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
root@docker-lab:~/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
root@docker-lab:~/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解析
root@docker-lab:~/017# cat Dockerfile
FROM busybox
ENV name www1707
ENTRYPOINT ["/bin/echo","Hello,$name"]
root@docker-lab:~/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
root@docker-lab:~/017# docker run test-017
Hello,$name
root@docker-lab:~/017# cat Dockerfile
FROM busybox
ENV name www1707
ENTRYPOINT ["/bin/sh","-c","echo Hello,$name"]
root@docker-lab:~/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
root@docker-lab:~/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指令将会被忽略
root@docker-lab:~/017# cat Dockerfile
FROM busybox
CMD echo "Hello world"
root@docker-lab:~/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
root@docker-lab:~/017# docker run test-017
Hello world
root@docker-lab:~/017# docker run -it test-017
Hello world
root@docker-lab:~/017# docker run -it test-017 /bin/sh
/ #
/ # exit
root@docker-lab:~/017#
ENTRYPOINT
该指令可以让容器以应用程序或者服务运行。ENTYRPOINT和CMD看上去很像,他们都可以指定要执行的命令及参数。但是ENTYRPOINT不会被忽略,一定会被执行,即使docker run 后面指定了其他命令。
exec格式--推荐格式
ENTYRPOINT ["executable","param1","param2"]
root@docker-lab:~/017# cat Dockerfile
FROM busybox
ENTRYPOINT ["/bin/echo","Hello"]
CMD ["world"]
root@docker-lab:~/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
root@docker-lab:~/017# docker run test-017
Hello world
root@docker-lab:~/017# docker run -it test-017 www1707
Hello www1707
shell格式--该格式会忽略掉CMD和docker run 后面的参数
ENTRYPOINT command param1 param2
root@docker-lab:~/017# cat Dockerfile
FROM busybox
ENTRYPOINT echo hello
CMD ["world"]
root@docker-lab:~/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
root@docker-lab:~/017# docker run test-017
hello
root@docker-lab:~/017# docker run -it test-017 www1707
hello
最佳实践
1、RUN 指定用来安装应用和软件包
2、ENTRYPOINT用来运行应用或者服务,可以用CMD提供额外的参数,还可以用docker run提供参数或者是替换掉CMD提供的参数
3、CMD可以为容器设置默认的启动命令,也可以用docker run替换掉
- Dockerfile RUN, CMD & ENTRYPOINT
Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. RUN是在 ...
- FW: Dockerfile RUN, CMD & ENTRYPOINT
Dockerfile RUN, CMD & ENTRYPOINT 在使用Dockerfile创建image时, 有几条指令比较容易混淆, RUN, CMD, ENTRYPOINT. R ...
- Dockerfile 中 RUN, CMD, ENTRYPOINT 的区别
RUN 指令:用于指定 docker build 过程中要运行的命令. 语法格式: RUN <command> 或 RUN ["<executeable>" ...
- 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j表示iii子树中离 ...
- 2019.01.08 codeforces 1009F. Dominant Indices(长链剖分)
传送门 长链剖分模板题. 题意:给出一棵树,设fi,jf_{i,j}fi,j表示iii的子树中距离点iii距离为jjj的点的个数,现在对于每个点iii要求出使得fif_ifi取得最大值的那个jjj ...
- 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...
- Heartbeat took longer than "00:00:01" at "09/06/2019 05:08:08 +00:00".
.netcore在k8s+docker+linux,部署后,偶尔会报这样的警告 Warn:Microsoft.AspNetCore.Server.KestrelHeartbeat took longe ...
- Tensorflow学习笔记2019.01.22
tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...
- Tensorflow学习笔记2019.01.03
tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...
- [转]【docker】CMD ENTRYPOINT 区别
本文转自:https://blog.csdn.net/u010900754/article/details/78526443 昨天用Dockerfile来启动mongodb的集群,启动参数--repl ...
随机推荐
- 来一波全套向量运算(C++)
//头文件要求 #include <cmath> struct P{long long x, y;}p[N]; //加法 P operator +(P x, P y){return (P) ...
- 树莓派播放网络磁盘MP3文件
树莓派映射网络磁盘 sudo mount -t cifs -o username=jerry.huang,password=Hello2014 //10.10.0.1/Public/ESLPod.co ...
- 【BZOJ1023】仙人掌图(仙人掌,动态规划)
[BZOJ1023]仙人掌图(仙人掌,动态规划) 题面 BZOJ 求仙人掌的直径(两点之间最短路径最大值) 题解 一开始看错题了,以为是求仙人掌中的最长路径... 后来发现看错题了一下就改过来了.. ...
- 【NowCoder368E】车站(线段树)
[NowCoder368E]车站(线段树) 题面 牛客网 题解 链交的结果显然和求解的顺序无关,因此我们可以拿线段树维护区间链的链交结果. 然后怎么求解最远点. 维护链交的时候再记录两个点表示到达链交 ...
- 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】
题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...
- 【转】从此以后谁也别说我不懂LDO了!
LDO是个很简单的器件,但是我跟客户沟通的过程中,发现客户工程师的技术水平参差不齐,有的工程师只是follow 别人以前的设计,任何原理和设计方法都不懂,希望大家看完这篇文章都能成为LDO 专家. 第 ...
- Uva796 Critical Links
用tarjan缩点 然后用dfn[u] < low[v]缩点并且保存起来 在sort一遍输出 #include<stdio.h> #include<string.h> # ...
- linux防火墙,高级策略策略实例详解(实例一)
双线服务器的控制问题: 要求:写出这个电信用户访问到双线web服务器时的IP变化过程(只写源IP,目标IP,和做SNAT还是DNAT等) 你觉得有没有问题? 实验环境: 精简一点可以使用下面的四台虚拟 ...
- 解决使用jedis连接是报DENIED Redis is running in protected mode错误
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was spe ...
- [bzoj3524][Couriers]
题目链接 思路 观察这个\((r - l + 1)/2\),很容易证明,如果一个数出现次数大于\((r - l + 1) / 2\),那么这个区间内第\((r - l + 1) / 2 + 1\)大一 ...