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

时间:2015-10-28 05:45:01

标签: python python-2.7 docker subprocess

我是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 container id

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

    call("sudo tar -cv * | sudo docker exec -i "+ tag1 +" tar x -C /usr/local/lib/", shell=True)
    
  4. 我使用以下方法重新创建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)
    
  5. 现在,我通过以下方式提交了docker镜像:

    dockercommit = ["sudo","docker","commit","-m",'"Building docker instance"',"-a",'"Tejas"',tag1,dockerfilename]
    
    call(dockercommit)
    
  6. 相同的命令通过bash工作正常。

    我遇到的问题是在第2步之后。我的脚本停止执行。手动点击 Ctrl + D 后,它会恢复,并执行其余的脚本!

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

    此外,如果当前没有正在运行的泊坞窗实例且仅存在基本图像,则按 Ctrl + D 立即释放脚本。

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

1 个答案:

答案 0 :(得分:1)

使用shell=True添加用户输入 强烈建议不要 documentation中提到:

  

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

您应该使用注释中提到的subprocess.popen