ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

19-Dockerfile中的ENTRYPOINT和CMD指令详解与比较

2020-04-27 17:52:45  阅读:261  来源: 互联网

标签:p1 exec 19 CMD 指令 ENTRYPOINT entry


Dockerfile中的ENTRYPOINT指令和CMD指令都可以设置容器启动时要执行的命令,但用途是有略微不同的。

ENTRYPOINT指令和CMD指令虽然是在Dockerfile中定义,但是在构建镜像的时候并不会被执行,只有在执行docker run命令启动容器时才会起作用。

在Dockerfile中,只能有一个ENTRYPOINT指令,如果有多个ENTRYPOINT指令则以最后一个为准。

在Dockerfile中,只能有一个CMD指令,如果有多个CMD指令则以最后一个为准。

在Dockerfile中,ENTRYPOINT指令或CMD指令,至少必有其一。

1. ENTRYPOINT指令

首先,执行docker run如果带有其他命令参数,不会覆盖ENTRYPOINT指令。

不过,docker run的--entrypoint可以覆盖Dockerfile中ENTRYPOINT设置的命令,后续文章详述。

1) exec格式用法(推荐)

ENTRYPOINT ["top","-b", "-H"]
exec格式,也被称为JSON风格["command","arg1"]。

在创建容器实例执行docker run命令时,设置的任何命令参数或CMD指令的命令,都将作为ENTRYPOINT指令的命令参数,追加到ENTRYPOINT指令的命令之后。

如,在Dockerfile中有如上ENTRYPOINT指令的情况下,执行docker run <container_name> -v启动容器。则容器启动后执行的第一条完整命令如下:

top -b -H -v

即将-v作为top的追加参数。

2) shell格式用法

ENTRYPOINT top -b -H
这种格式屏蔽追加任何参数,即CMD指令或docker run ... <command>的参数都将被忽略。

采用shell格式,在创建容器后会首先调用Shell,即自动在命令前面追加/bin/sh -c。如,对于上述定义,在容器启动时执行的第一条命令如下:

/bin/sh -c top -b -H

这样,ENTRYPOINT指令设置的top命令就不是容器中的第一个进程PID 1,这样在容器停止的时候就无法收到系统的SIGTERM信号。要想收到SIGTERM信号,务必使用Bash的内置exec命令使得top的PID 1,定义ENTRYPOINT指令如下:

ENTRYPOINT exec top -b -H
2. CMD指令

首先,执行docker run如果带有其他命令参数,将会覆盖CMD指令。

如果在Dockerfile中,还有ENTRYPOINT指令,则CMD指令中的命令将作为ENTRYPOINT指令中的命令的参数(CMD和ENTRYPOINT指令必须采用JSON风格,即exec格式,定义)。

1) exec格式用法(推荐)

CMD ["echo","hello", "world"]
exec格式,也被称为JSON风格["command","arg1"]。

这种格式,在容器执行时不会调用任何Shell,即不会进行命令中的变量替换。要进行Shell处理,需要将sh直接加入到命令中:

CMD ["sh", "-c", "echo $HOME"]
这样,$HOME才会被解析为真实的主目录。

但是并不推荐将sh加入到CMD指令中,因为CMD指令的命令往往作为ENTRYPOINT指令的追加参数,因而如下形式更常见:

CMD ["-c","echo world"]
2) shell格式用法

CMD echo $HW
这种格式,在创建容器后会首先调用Shell,即自动在命令前面追加/bin/sh -c,即上述设置将执行如下命令:

/bin/sh -c echo $HW

3. 比较ENTRYPOINT与CMD指令

ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。
docker run <command>往往用于给出替换CMD的临时参数。

ENTRYPOINT&CMD
CMD\ENTRYPOINT N/A ENTRYPOINT exec_entry p1_entry ENTRYPOINT [“exec_entry”, “p1_entry”]
N/A Error /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD [“exec_cmd”, “p1_cmd”] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry exec_cmd p1_cmd
CMD [“p1_cmd”, “p2_cmd”] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd /bin/sh -c exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd
 

参考链接:

https://docs.docker.com/engine/reference/builder/

标签:p1,exec,19,CMD,指令,ENTRYPOINT,entry
来源: https://www.cnblogs.com/robinunix/p/12788389.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有