【发布时间】:2020-06-16 09:47:14
【问题描述】:
我有一个通过 SSH 访问的远程 docker 容器。我通常使用 docker start 命令启动容器。
sudo docker start 1db52045d674
sudo docker exec -it 1db52045d674; bash
这会在容器中启动一个交互式 tty,我通过 ssh 访问它。 如果我关闭 SSH 连接,我希望容器自行终止。有没有办法做到这一点?
【问题讨论】:
我有一个通过 SSH 访问的远程 docker 容器。我通常使用 docker start 命令启动容器。
sudo docker start 1db52045d674
sudo docker exec -it 1db52045d674; bash
这会在容器中启动一个交互式 tty,我通过 ssh 访问它。 如果我关闭 SSH 连接,我希望容器自行终止。有没有办法做到这一点?
【问题讨论】:
.bash_logout 每次使用 exit 命令结束终端会话时都会执行。
所以当你退出远程服务器上的 ssh 连接时,你可以使用这个文件来运行 docker stop 命令。
docker stop container_name
注意:如果用户关闭终端窗口而不是编写退出命令,则不会执行此文件。
【讨论】:
我希望有一个更优雅的解决方案,但最后我通过 ssh 启动了一个 bash 脚本来捕获 SIGHUP 类似:
trap 'docker stop CONTAINER_NAME' SIGHUP;
while sleep 5;
do echo "foo";
done;
所以当操作员关闭 SSH 连接时,陷阱会被触发并且 docker 会很好地停止
【讨论】:
您可以使用--init 参数进行初始化。这样,您的容器将能够接管 init 进程,您可以向它发送终止信号:https://docs.docker.com/engine/reference/run/#specify-an-init-process
启动服务器:
docker run --init \
-p 2222:2222 \
-e USER_NAME=user \
-e USER_PASSWORD=pass \
-e PASSWORD_ACCESS=true \
-e SUDO_ACCESS=true \
linuxserver/openssh-server
请注意此处的--init 和-e SUDO_ACCESS=true 参数。
在另一个(客户端)shell中,
$ ssh user@127.0.0.1 -p 2222 -oStrictHostKeyChecking=accept-new
Warning: Permanently added '[127.0.0.1]:2222' (ECDSA) to the list of known hosts.
user@127.0.0.1's password:
Welcome to OpenSSH Server
2a。向 PID1 (docker-init) 发送终止信号:
$ sudo kill -s SIGINT 1
[sudo] password for user:
$ Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.
容器不见了。
我希望这会有所帮助。
【讨论】: