Dockerfile 中的 CMD 和 ENTRYPOINT 有什么区别?
技术问答
473 人阅读
|
0 人回复
|
2023-09-11
|
在 Dockerfiles 有两个命令类似于我:CMD和ENTRYPOINT. 但我认为它们之间存在(微妙?)区别 - 否则,两个命令对同一件事毫无意义。
) X. b5 ^% u% r! Q' N5 g文件指出 CMD3 W/ L1 n1 q7 [! k! r3 D
CMD 的主要目的是为正在执行的容器提供默认值。: p8 X3 F+ V8 J5 i# W
对于ENTRYPOINT:- B ]* v6 t, O- v
ENTRYPOINT 可以帮助您配置可以作为可执行文件运行的容器。0 X4 m: [5 ] ?9 {4 r8 O) h$ r$ H
那么,这两个命令有什么区别呢?5 D2 P3 V. b4 J `* P3 G
5 b) n8 U/ W$ P; _6 f3 |; Q9 W! w 解决方案:
) c p) l2 u7 P$ L8 z* u" g" C Docker 有一个默认入口点,它有/bin/sh -c但没有默认命令。
7 M! o' `" Q; }- g. J. Q1 Q3 Q4 s当您像这样运行 docker 时: docker run -i -t ubuntu bash 入口点为默认值/bin/sh -c,图像是ubuntu,命令是bash。9 R/ o7 A: _$ ?8 j. ^& A( e5 a
该命令通过入口点运行。也就是说,实际执行是/bin/sh -c bash. 这使得 Docker 可以RUN依靠 shell 快速实现分析器。. p3 q, A% g8 j: w; F- F' E- E* i0 X; S0 g
后来,人们要求自定义这一点,所以ENTRYPOINT并--entrypoint介绍。
1 v/ J" n$ g' h& X% U0 P$ \' j& ~9 hubuntu上述示例中的所有内容都是命令并传递给入口点。CMD就像你执行指令一样docker run -i -t ubuntu . 将是入口点的参数。! J" e' d) G; w5 _0 o) m' v: ~! j
如果您更改此命令,您也将得到相同的结果docker run -i -t ubuntu。由于ubuntu Dockerfile指定默认 CMD,您仍将在容器中启动 bash shell :CMD ["bash"]
. }3 A9 N7 {, ]2 V当一切都传递到入口点时,你可以从图像中得到很好的行为。@Jiri 示例很好,它展示了如何将图像用作二进制。["/bin/cat"]作为入口点,然后执行docker run img /etc/passwd,你会得到它,//etc/passwd是命令并传递给入口点,所以最终结果很简单/bin/cat /etc/passwd。
) {7 ?8 J1 E9 g! q: w# X另一个例子是任何 cli 作为入口点。例如,如果你有一个Redis图像,而不是操作docker run redisimg redis -H something -u toto get key,你可以简单地拥有它ENTRYPOINT ["redis","-H","something","-u","toto"],然后这样运行的结果是一样的docker run redisimg get key。 |
|
|
|
|
|