TILdocker kill
意思是“杀死”,意思是“让它死”,而不是 POSIX 意义上的“发送信号”。
我们有几个集装箱需要发送SIGHUP
以重新加载配置,但这会导致它们忽略“始终”的重新启动策略,这不是我们想要的。
在不影响这些容器自动重启能力的情况下向这些容器发送信号的最佳方式是什么?
\n为了更清楚地展示我们所看到的问题,请看以下示例。
\n我们有一些容器的重启策略设置为始终
\n$ docker inspect cloudwatch-exporter | jq .[].HostConfig.RestartPolicy\n{\n "Name": "always",\n "MaximumRetryCount": 0\n}\n
Run Code Online (Sandbox Code Playgroud)\n我们在某个时候重新加载配置docker kill
:
$ docker kill --signal=SIGHUP cloudwatch-exporter\ncloudwatch-exporter\n
Run Code Online (Sandbox Code Playgroud)\n一段时间后,发生了一些事情终止了该进程。为了模拟这一点,我将在容器内发送一个信号:
\n$ docker exec cloudwatch-exporter bash -c "kill 1"\n
Run Code Online (Sandbox Code Playgroud)\n此时,容器已死亡并且不会重新启动:
\n$ docker ps -a | grep cloudwatch-exporter\nc7827204bba5 prom/cloudwatch-exporter:cloudwatch_exporter-0.8.0 "java -jar /cloudwat\xe2\x80\xa6" 20 hours ago Exited (143) 3 minutes ago cloudwatch-exporter\n
Run Code Online (Sandbox Code Playgroud)\n我们有哪些替代方案可以使用docker kill …
我注意到当我使用user
on 选项时exec
,它不采用指定用户的环境。
$ sudo -i puppet apply -e "exec { '/usr/bin/env': logoutput => true, user => nobody}"
notice: /Stage[main]//Exec[/usr/bin/env]/returns: SHELL=/bin/bash
notice: /Stage[main]//Exec[/usr/bin/env]/returns: USER=root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: USERNAME=root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
notice: /Stage[main]//Exec[/usr/bin/env]/returns: MAIL=/var/mail/root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: PWD=/root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: HOME=/root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: LOGNAME=root
notice: /Stage[main]//Exec[/usr/bin/env]/returns: executed successfully
Run Code Online (Sandbox Code Playgroud)
因此,尽管该命令运行为nobody
,USER
,HOME
等不按预期设定。有什么方法可以exec
模拟登录shell,以便按预期设置环境?