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

我是Docker的新手。 我有一个python脚本,它可以:

  1. 通过以下方式启动docker集装箱:

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

     call("sudo docker exec -i "+ tag1 +" rm /usr/local/lib/boost_logger",shell=True) 

    其中tag1是我的docker容器id

  3. 我从我的centos文件夹复制新的文件到docker实例通过:

     call("sudo tar -cv * | sudo docker exec -i "+ tag1 +" tar x -C /usr/local/lib/", shell=True) 
  4. 我使用以下方法重新创build2个软链接:

     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) 
  5. 现在,我通过以下方式提交Docker镜像:

     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将立即释放脚本。

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

如文档中所述, 强烈build议添加shell=True用户input:

警告 :执行包含来自不可信源的未经处理input的shell命令会使程序容易受到shell注入的攻击,这是一个严重的安全缺陷,可能导致任意的命令执行。 出于这个原因,在外部input构build命令string的情况下,强烈build议不要使用shell = True:

你应该改为使用subprocess.popen如注释中所述。