Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在终止docker容器时执行脚本_Docker - Fatal编程技术网

如何在终止docker容器时执行脚本

如何在终止docker容器时执行脚本,docker,Docker,在控制台上键入时,我希望: docker ^a docker container^ stop 在终止之前执行脚本。可能吗 docker stop命令首先尝试通过向容器中的根进程(PID 1)发送SIGTERM信号来停止正在运行的容器。如果进程在超时时间内未退出,将发送SIGKILL信号 实际上,这意味着您必须定义一个入口点脚本,该脚本将截获(捕获)SIGTERM信号并酌情执行任何关闭逻辑 示例入口点脚本可以如下所示: #/bin/bash #定义清理过程 清理(){ echo“容器已停止,正在

在控制台上键入时,我希望:

docker ^a docker container^ stop
在终止之前执行脚本。可能吗

docker stop命令首先尝试通过向容器中的根进程(PID 1)发送SIGTERM信号来停止正在运行的容器。如果进程在超时时间内未退出,将发送SIGKILL信号

实际上,这意味着您必须定义一个入口点脚本,该脚本将截获(捕获)SIGTERM信号并酌情执行任何关闭逻辑

示例入口点脚本可以如下所示:

#/bin/bash
#定义清理过程
清理(){
echo“容器已停止,正在执行清理…”
}
#陷阱信号项
陷阱“清理”术语
#执行命令
"${@}" &
#等等
等等!
(外壳信号处理,关于等待,将在更详细的部分中解释)

请注意,对于上面的入口点,只有当容器显式停止时,才会执行清理逻辑。如果您希望它在底层进程/命令自行停止(或失败)时也运行,可以按如下方式重新构造它

。。。
#陷阱信号项
陷阱“真实”术语
#执行命令
"${@}" &
#等等
等等!
#清理
清理

您希望脚本在主机上的容器内还是容器外执行?在容器内。请注意,ENTRYPOINT必须以exec表单的形式作为PID 1运行:ENTRYPOINT[“可执行”、“param1”、“param2”]我将脚本设置为
ENTRYPOINT[“myscript”]
。该脚本的定义如建议的那样,并具有信号1、2、9的陷阱。但当我停止集装箱时,信号似乎没有被捕获。。。不明白我错过了什么,如何在systemd容器中工作?例如,centos 7 basedHowever我尝试了这个,它立即退出,代码为0。基本发行版重要吗?我用的是阿尔卑斯山。我安装了默认情况下不存在的bash。更新:问题是“${@}”不会创建一个永久的进程。我把它换成了less/etc/password,这很有效,但必须有一个更干净的方法