Dockerfile——ENTRYPOINT详解

这篇具有很好参考价值的文章主要介绍了Dockerfile——ENTRYPOINT详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

  Entrypoint的作用是,把整个container变成了一个可执行的文件,这样不能够通过替换CMD的方法来改变创建container的方式。但是可以通过参数传递的方法影响到container内部。


一、ENTRYPOINT 命令格式介绍

ENTRYPOINT 有两种格式:

  • ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式,首选)
  • ENTRYPOINT command param1 param2 (shell 格式)

exec 格式
  docker run image 后面跟的命令行参数将会添加到 ENTRYPOINT 所有参数的最后,且会覆盖掉所有 CMD 命令中的参数。这将允许运行时传递参数给 ENTRYPOINT 命令,例如 docker run image -d 会将 -d 参数传给 ENTRYPOINT 命令 。ENTRYPOINT 命令可以通过 docker run --entrypoint 参数来覆盖 。

shell 格式
  会忽略所有 CMD 命令的参数和 docker run 的命令行参数,ENTRYPOINT 要运行的命令会作为 /bin/sh -c 的子命令运行,而且 /bin/sh 不会传递信号,也就是说 ENTRYPOINT 要运行的命令不是 PID 为 1 的进程,且不会收到 Unix 信号,所以你要执行的命令不会收到 docker stop 发出的 SIGTERM 信号。

二、示例

Exec格式
  用使用CMD的参数,run [image] 会替代CMD参数,会使用run中的多个参数

示例一
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"] //表示默认参数,没提供参数,则使用此参数

docker run -it [image] 输出:Hello world 
docker run -it [image] "hanke"  输出 Hello hanke  ,不使用默认参数
docker run -it [image] "hanke" "hujing"  输出 Hello hankd hujing ,使用多个提供参数

示例二
可以使用 exec 格式的 ENTRYPOINT 来设置稳定的默认命令和参数,再通过CMD 命令设置容易变动的默认值。

FROM ubuntu
ENTRYPOINT["top","-b"]
CMD["-c"]

运行这个容器,可以看到只有 top 一个进程:

$ docker run -it --rm --name testtop -H
top - 08:25:00 up  7:27,  0users,  load average: 0.00, 0.01, 0.05
Threads:   1total,   1running,   0sleeping,   0stopped,   0zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2056668total,  1616832used,   439836free,    99352buffers
KiB Swap:  1441840total,        0used,  1441840free.  1324440cached Mem
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1root      2001974423362080R  0.0  0.1   0:00.04 top

可以通过 docker exec 进一步确认:

$ docker exec-it testps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         12.6  0.1  197522352?        Ss+  08:24   0:00 top -b -H
root         70.0  0.1  155722164?        R+   08:25   0:00 ps aux

Shell格式
  可以给 ENTRYPOINT 命令指定一个纯字符串,它将通过 /bin/sh -c 执行。这种格式会处理 shell 环境变量,忽略所有的 CMD 命令和 docker run 命令行参数。为了确保 docker stop 能正确的停止运行的 ENTRYPOINT 命令,容器需要通过 exec 来启动。

FROM ubuntu
ENTRYPOINT exec top -b

运行这个镜像,将会看到 PID 为 1 的进程:

	$ docker run -it --rm --name test top
	Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached
	CPU:   5% usr   0% sys   0% nic  94% idle   0% io   0% irq   0% sirq
	Load average: 0.08 0.03 0.05 2/98 6
	  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
	    1     0 root     R     3164   0%   0% top -b

如果忘了在 ENTRYPOINT 命令中添加 exec:

FROM ubuntu
ENTRYPOINT top  -b
CMD  --ignored-param1

运行

	$ docker run -it --name test top --ignored-param2
	Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached
	CPU:   9% usr   2% sys   0% nic  88% idle   0% io   0% irq   0% sirq
	Load average: 0.01 0.02 0.05 2/101 7
	  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
	    1     0 root     S     3168   0%   0% /bin/sh -c top -b cmd cmd2
	    7     1 root     R     3164   0%   0% top -b
从 top 的输出中可以看到 PID 为 1 的进程不是 ENTRYPOINT 中设置的命令
这时运行 docker stop test,容器不能优雅的退出(docker stop 命令在一个超时时间后会强制发送 SIGKILL[9] 信号):
	$ docker exec -it test ps aux
	PID   USER     COMMAND
	    1 root     /bin/sh -c top -b cmd cmd2
	    7 root     top -b
	    8 root     ps aux
	$ /usr/bin/time docker stop test
	test
	real	0m 10.19s
	user	0m 0.04s
	sys	0m 0.03s

总结

CMD 和 ENTRYPOINT 命令都定义了容器运行时运行命令。下面有几条规则:

  • Dockerfile 必须有一条 CMD 或 ENTRYPOINT 命令
  • 如果容器作为可执行程序运行,需要指定 ENTRYPOINT 命令,
  • CMD 命令应该用来定义 ENTRYPOINT 命令的默认参数

下表展示了 ENTRYPOINT / CMD 组合:
dockerfile entrypoint,Docker,docker,运维文章来源地址https://www.toymoban.com/news/detail-716728.html

到了这里,关于Dockerfile——ENTRYPOINT详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 48-Dockerfile-CMD/ENTRYPOINT指令

    前言 本篇来学习下Dockerfile中的CMD/ENTRYPOINT指令 CMD 作用 启动容器时默认执行的命令 说明: 一个 Dockerfile 只有一个 CMD 指令,只有最后一个 CMD 指令生效 使用 docker run -d xxx CMD 命令是可以覆盖 Dockerfile 中的 CMD 指令的 格式 使用示例 新建dockerfile 制作镜像 运行容器 可以看到只执

    2024年02月04日
    浏览(72)
  • dockerfile用ENTRYPOINT好还是用CMD好

    在 Dockerfile 中使用 `ENTRYPOINT` 和 `CMD` 都有其用途和优劣势,具体取决于你的应用和需求。这两个指令的主要区别在于如何处理容器启动时的命令参数。 1. `CMD` 指令:    - `CMD` 用于定义容器启动时的默认命令,但它可以在运行容器时被替代。如果在运行容器时提供了命令参数

    2024年02月08日
    浏览(52)
  • dockerfile ENTRYPOINT 执行.sh脚本提示找不到文件或文件不存在 No such file or directory

    我这里记录的是我遇到的一种特殊情况,如果你也遇到了这个问题,且都试了在百度中找到的解决方法还没有解决可以看看是不是和我遇到的问题一样。 在Dockerfile中,我ADD了两个文件,一个是jar包,一个是一个执行jar包的.sh文件 但是在使用命令: 就会提示 /bin/sh: 0: cannot

    2024年01月21日
    浏览(47)
  • docker ENTRYPOINT 执行多条命令

    如何在docker里面同时启动多个pm2进程_祥仔先生的博客-CSDN博客_docker pm2 ENTRYPOINT 命令1 命令2 命令3 dockerfile中添加: RUN chmod -x setup.sh ENTRYPOINT [\\\"sh\\\", \\\"./setup.sh\\\"]

    2024年02月12日
    浏览(41)
  • docker: CMD和ENTRYPOINT的区别

    ENTRYPOINT: 容器的执行命令(属于正统命令) 可以使用 --build-arg ENVIROMENT=integration 参数覆盖 ocker build --build-arg ENVIROMENT=integration 两者同时存在时 CMD 作为 ENTRYPOINT 的默认参数使用 外部提供参数会覆盖 CMD 提供的参数。 CMD单独存在时 CMD 替代 ENTRYPOINT 作为容器的执行命令 外部命

    2024年02月14日
    浏览(56)
  • 【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?

    使用镜像 alpine 起个容器,使其保持后台运行,正常情况有如下的效果,可以发现容器保持运行状态。 但是有时候一些容器镜像按照上述方法却达不到预期效果。比如下面这个容器,一创建完就退出了。 那么问题出在哪个环节呢? 首先明确一个Docker容器的特性, docker容器运

    2024年02月14日
    浏览(39)
  • Docker之RUN、COMMAND、ENTRYPOINT辨析

    一  回顾docker一些命令 ①  run create start 的辨析 ②  获取 容器在宿主机 的PID docker inspect --format详解  ③  容器 资源 使用 ④  查看容器的 完整 命令     悬浮镜像dangling image 产生的原因和处理方法   ④  save 和 load ⑤⑥⑦⑧⑨⑩  二    Dockerfile指令的回顾 官网Dockerfile参考

    2024年02月06日
    浏览(61)
  • docker的run,cmd,entrypoint分析和对比

    本文一起看下Dockerfile中经常用到的几个类似命令,RUN,CMD,ENTRYPOINT。 想要有容器我们就必须先创建镜像,而想要有镜像,我们则必须写一个用来描述想要创建的镜像的文件,这个文件我们一般叫做Dockerfile (非强制) ,则容器怎么来的就如下图: 经过上图的 过程1 我们就有

    2024年02月01日
    浏览(36)
  • Docker中,CMD 和 ENTRYPOINT 的区别,简单!明了!

    目录 CMD 和 ENTRYPOINT的区别:结论篇 CMD 和 ENTRYPOINT的其他细节结论 测试篇 一、 CMD的两种格式完全等效,但是ENTRYPOINT两种格式是有区别的 二、 docker run 命令替代了dockerfile的CMD命令 三、 docker run 命令在ENTRYPOINT的键值对格式下,是作为ENTRYPOINT命令的参数,docker run wx-centos ls -

    2024年02月05日
    浏览(42)
  • [Docker]五.Docker中Dockerfile详解

    Dockerfile 就是用来构建 docker 镜像的构建文件 新建一个名为 Dockerfile 文件,并在文件内添加以下内容:         要构建并实现上面的镜像, 以前的办法: 下载一个centos镜像,通过镜像启动容器,进入容器,然后下载net-tools软件,然后cd 到wwwroot目录,执行/bin/bash,然后退出容器,把这个容器

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包