【问题标题】:How to kill/stop remote Docker container after disconnecting SSH断开 SSH 后如何杀死/停止远程 Docker 容器
【发布时间】:2020-06-16 09:47:14
【问题描述】:

我有一个通过 SSH 访问的远程 docker 容器。我通常使用 docker start 命令启动容器。

sudo docker start 1db52045d674
sudo docker exec -it 1db52045d674; bash

这会在容器中启动一个交互式 tty,我通过 ssh 访问它。 如果我关闭 SSH 连接,我希望容器自行终止。有没有办法做到这一点?

【问题讨论】:

    标签: docker ssh


    【解决方案1】:

    .bash_logout 每次使用 exit 命令结束终端会话时都会执行。

    所以当你退出远程服务器上的 ssh 连接时,你可以使用这个文件来运行 docker stop 命令。

    1. 如果不存在,则创建 ~/.bash_logout 文件。
    2. 添加以下命令以停止此文件中的 docker 容器。 示例:
        docker stop container_name
    

    注意:如果用户关闭终端窗口而不是编写退出命令,则不会执行此文件。

    【讨论】:

    • 感谢您的回答。我正在寻找一种解决方案,让用户关闭终端窗口或 SSH 连接由于某种原因而中断
    • 在这种情况下,我认为您可以在 ssh 连接启动时在远程服务器上运行一个脚本,该脚本会不断轮询/检查 ssh 是否已连接。当 ssh 断开连接时,它会运行 docker stop 命令。
    【解决方案2】:

    我希望有一个更优雅的解决方案,但最后我通过 ssh 启动了一个 bash 脚本来捕获 SIGHUP 类似:

    trap 'docker stop CONTAINER_NAME' SIGHUP;
    while sleep 5;
    do echo "foo";
    done;
    

    所以当操作员关闭 SSH 连接时,陷阱会被触发并且 docker 会很好地停止

    【讨论】:

      【解决方案3】:

      您可以使用--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中,

      1. ssh 进入容器:
      $  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.
      

      容器不见了。

      我希望这会有所帮助。

      【讨论】:

      • 我的运行 cmd 是这样的: sudo docker run --name hb_cont --init --gpus all -it --privileged --network=host linuxserver/openssh-server 我将 root 定义为用户在我的 Dockerfile 中。就我而言,我实际上没有使用端口选项。我直接ssh到主机,然后运行docker。这就是为什么这对我不起作用?
      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多