在命名管道上的主机上侦听来自Docker容器的命令

时间:2019-07-31 11:46:34

标签: bash docker

我试图通过通过命名管道发送命令并在主机上监听它来从容器内部重新启动Docker容器。

但是看来主机没有在监听它-我打电话

echo "incoming" > host_directory/cdm_container_pipe3
echo "restart" > host_directory/cdm_container_pipe3

第一个调用只是阻塞,好像没有什么东西从管道中读取一样。

这是脚本:

#!/bin/bash -p

#

if [ -z "$container_id" ]; then
    container_id=0
fi

let "container_id=container_id+1"

#

container_name="cdm_container$container_id"

pipe="cdm_container_pipe$container_id"
if [ ! -p $pipe ]; then
  echo 'Creating pipe'
  mkfifo $pipe
fi


#

start_container() {
    docker rm $container_name
    docker run -v ~/dev/obd:/host_directory -it --name $container_name --privileged cdm_image:latest
}

#

start_container

#

while true
do
    if read line <$pipe; then
        COMMAND=$(cat $pipe)
        echo "received from pipe: $COMMAND"

        if [ $COMMAND == "restart" ]; then
            echo " updating repo and restarting container "
            docker stop $container_name
            git pull origin master
            start_container
        fi
    fi
done

作为参考,我尝试了一个缩减版本,该版本不会启动Docker容器:

#!/bin/bash -p

pipe="test_pipe"
if [ ! -p $pipe ]; then
  echo 'Creating pipe'
  mkfifo $pipe
fi

#

while true
do
    if read line <$pipe; then
        COMMAND=$(cat $pipe)
        echo "received from pipe: $COMMAND"
    fi
done

我能够通过host_directory / pipe_name从另一个终端进行管道连接以及从正在运行的容器中进行管道连接,成功使之工作

启动Docker容器后while循环未运行是否存在问题?我应该尝试在其他线程中运行容器吗?

谢谢, 伊恩

2 个答案:

答案 0 :(得分:0)

docker run块,因此要使其正常运行,我需要使用-d(和一个正在执行的命令)

答案 1 :(得分:0)

最简单的方法是退出进程,并设置restart policy,以在发生这种情况时重新启动容器。如果操作员希望从外部重新启动容器,则可以sudo docker restart给定其名称或容器ID。

(如果您正在寻找像Kubernetes这样的集群部署解决方案,那么依靠Orchestrator更好。处理“数据库尚未准备好”之类的问题的通常方法是“只是崩溃,让Orchestrator重新启动您例如,“大锤”修复错误的Kubernetes Pod的通用方法是删除它们let,然后由协调器重新创建它们。此外,很难将诸如命名管道之类的东西从运行在任意节点。)