Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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/7/python-2.7/5.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
python脚本的执行在执行docker exec命令时挂起_Python_Python 2.7_Docker_Subprocess - Fatal编程技术网

python脚本的执行在执行docker exec命令时挂起

python脚本的执行在执行docker exec命令时挂起,python,python-2.7,docker,subprocess,Python,Python 2.7,Docker,Subprocess,我是新来的码头工人。我有一个python脚本,它可以: 通过以下方式启动docker容器: call(["sudo docker run -i -t -d test /bin/sh"],shell=True) 通过以下命令删除容器内存在的软链接: call("sudo docker exec -i "+ tag1 +" rm /usr/local/lib/boost_logger",shell=True) 其中tag1是我的docker容器id 我通过以下方式将新文件从centos文件夹复

我是新来的码头工人。我有一个python脚本,它可以:

  • 通过以下方式启动docker容器:

    call(["sudo docker run -i -t -d test /bin/sh"],shell=True)
    
  • 通过以下命令删除容器内存在的软链接:

    call("sudo docker exec -i "+ tag1 +" rm /usr/local/lib/boost_logger",shell=True)
    
    其中tag1是我的docker容器id

  • 我通过以下方式将新文件从centos文件夹复制到docker实例:

    call("sudo tar -cv * | sudo docker exec -i "+ tag1 +" tar x -C /usr/local/lib/", shell=True)
    
    dockercommit = ["sudo","docker","commit","-m",'"Building docker instance"',"-a",'"Tejas"',tag1,dockerfilename]
    
    call(dockercommit)
    
  • 我使用以下方法重新创建了2个软链接:

    call("sudo docker exec -i "+ tag1 +" ln -s /usr/local/lib/libboost_logger.so /usr/local/lib/boost_logger",shell=True)
    
    call("sudo docker exec -i "+ tag1 +" ln -s /usr/local/lib/libredis_client.so /usr/local/lib/redis_client",shell=True)
    
  • 现在,我通过以下方式提交docker映像:

    call("sudo tar -cv * | sudo docker exec -i "+ tag1 +" tar x -C /usr/local/lib/", shell=True)
    
    dockercommit = ["sudo","docker","commit","-m",'"Building docker instance"',"-a",'"Tejas"',tag1,dockerfilename]
    
    call(dockercommit)
    
  • 同样的命令在bash中也可以正常工作

    我面临的问题是在第2步之后。我的脚本停止执行。在我手动按Ctrl+D并执行脚本的其余部分后,它将恢复

    我正在virtualbox上运行centos上的docker实例。我已经分配了3个内核和大约10GB的基本内存

    此外,如果当前没有正在运行的docker实例,并且只有基本映像存在,则按Ctrl+D将立即释放脚本


    但是,如果我有更多的实例,或者可能是在同一脚本的第二次或第三次迭代期间,释放控件需要更长的时间。

    使用
    shell=True添加用户输入是强烈反对的
    报告中提到:

    警告:执行包含来自不受信任源的未初始化输入的shell命令会使程序易受shell注入攻击,这是一个严重的安全缺陷,可能导致任意命令执行。因此,在命令字符串由外部输入构造的情况下,强烈建议不要使用shell=True:


    您应该按照注释中的说明使用。

    test
    您自己的图像吗?如果是这样,您可以共享Dockerfile吗?您认为
    -i
    选项的作用是什么?