当前位置: 首页 > 面试题库 >

在docker入口点脚本中使用exec有什么目的?

艾安和
2023-03-14
问题内容

例如在redis官方图片中:

https://github.com/docker-library/redis/blob/master/2.8/docker-
entrypoint.sh

#!/bin/bash
set -e

if [ "$1" = 'redis-server' ]; then
    chown -R redis .
    exec gosu redis "$@"
fi

exec "$@"

为什么不像往常一样在没有exec的情况下运行命令呢?


问题答案:

正如@Peter Lyons所说,使用exec将替换父进程,而不是运行两个进程。

这对于在Docker中正确代理信号很重要。例如,如果Redis是在没有exec的情况下启动的,则它将不会收到SIGTERMon docker stop,也不会有机会彻底关闭。在某些情况下,这可能导致数据丢失或僵尸进程。

如果您确实启动了子进程(即不使用exec),则父进程将负责适当地处理和转发信号。这是在容器中运行多个进程时最好使用supervisor或类似命令的原因之一,因为它将适当地转发信号。



 类似资料:
  • 问题内容: 我注意到,许多docker的entrypoint.sh脚本都执行以下操作: 是什么和什么? 问题答案: 它基本上接受所有额外的命令行参数,并将它们作为命令执行。目的基本上是“在此.sh脚本中执行所有操作,然后在同一shell中运行用户在命令行中传递的命令”。

  • 我理解Lua脚本与watch/multi/exec相比相对较新。那么现在有没有理由使用watch/multi/exec呢?

  • 按照在CMD之前执行脚本的建议(我需要在容器重新启动之前清除一个临时dir,以修复一个bug),我将docker文件从使用CMD修改为entrypoint,如下所示: 并且在入口点文件中,在rm-rf命令之后结束: 但是docker无法启动容器,它退出,容器日志显示:

  • 问题内容: 我正在尝试对我的node.js应用进行docker化。构建容器时,我希望它运行a ,然后启动节点服务器。因此,我将这些操作放在.sh脚本中。并在ENTRYPOINT中将脚本作为单个命令运行: 我的docker-entrypoint.sh看起来像这样: 构建此映像并运行后: 我越来越: 我将其装入容器,并且docker-entrypoint.sh的许可为: 三个问题: 我的bash脚本语

  • 在过去的几个月里,我一直在使用nsenter来获得一个运行在容器上的shell以进行调试。我听说过并使用过1.3版中引入的docker exec。Docker exec似乎是进入容器进行调试的最佳实践,但我想知道使用Docker exec与使用Nsenter相比是否有任何缺点。比较两者的信息很少。在使用和nsenter时,是否有任何我应该注意或避免的特定问题?

  • 我在docker中编写了一个简单的脚本来使用dnsmasq 我的逻辑很简单,k8s第一次启动docker contain时,它将在设置为正确的值,我的脚本将把它复制到和在至使用dnsmasq服务。 当docker因为保持不变,因此将刚刚启动。它大部分时间都能工作,但当k8s由于健康检查失败而重新启动容器时,它将无法工作。当这种情况发生时,我的