栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在CMD之前执行脚本

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在CMD之前执行脚本

使用自定义入口点

创建一个可以执行所需操作的自定义入口点,然后最后执行您的CMD。

注意 :如果您的映像已经定义了一个自定义入口点,则可能需要扩展它而不是替换它,或者您可以更改所需的行为。

entrypoint.sh

#!/bin/sh## Do whatever you need with env vars here ...# Hand off to the CMDexec "$@"

Dockerfile的

COPY entrypoint.sh /entrypoint.shRUN chmod 755 /entrypoint.shENTRYPOINT ["/entrypoint.sh"]

Docker将使用CMD作为参数来运行您的入口点。如果您的CMD为

init
,则:

/entrypoint.sh init

exec
入口点脚本末尾的at负责在入口点完成需要执行的操作时移交给CMD。

为什么这样

ENTRYPOINT和CMD的使用经常使Docker新手感到困惑。在评论中,您对此表示困惑。这是它的工作原理以及原因。

ENTRYPOINT是在容器内运行的初始对象。它以CMD作为参数列表。因此,在此示例中,在容器中运行的是此参数列表:

# ENTRYPOINT = /entrypoint.sh# CMD        = init["/entrypoint.sh", "init"]# or shown in a simpler form:/entrypoint.sh init

不需要图像具有ENTRYPOINT。如果未定义,则Docker具有默认值:

/bin/sh -c

因此,按照您的原始情况,没有ENTRYPOINT,并且使用CMD为

init
,Docker将会运行以下命令:

/bin/sh -c 'init'^--------^  ^--^    |         ------- CMD    --------------- ENTRYPOINT

最初,Docker只提供CMD,并且

/bin/sh-c
被硬编码为ENTRYPOINT(您无法更改)。在此过程中的某些时候,人们用例中他们不得不做更多的自定义事情,而Docker公开了ENTRYPOINT,因此您可以将其更改为所需的任何内容。

在上面显示的示例中,ENTRYPOINT被替换为自定义脚本。(尽管它最终仍在运行

sh
,因为它始于
#!/bin/sh
。)

ENTRYPOINT将CMD作为参数。在entrypoint.sh脚本的末尾是

exec "$@"
。由于
$@
扩展到为脚本提供的参数列表,因此将其转换为

exec "init"

因此,脚本完成后,它消失了,并被替换

init
为PID1。(这样做
exec
是-它 另一个命令 替换 了当前进程。)

如何包括CMD

在评论中,您询问了如何在Dockerfile中添加CMD。是的,你可以这么做。

Dockerfile的

CMD ["init"]

或者,如果您的命令还有更多内容,例如参数

init -a -b
,则将如下所示:

CMD ["init", "-a", "-b"]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/409274.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号