【问题标题】:Execution of python script hangs while executing docker exec command执行 docker exec 命令时执行 python 脚本挂起
【发布时间】:2015-10-28 05:45:01
【问题描述】:

我是 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. 我使用以下方法重新创建了 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)
    

相同的命令可以通过 bash 正常工作。

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

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

此外,如果当前没有运行 docker 实例且仅存在基本映像,则按 Ctrl+D 会立即释放脚本。

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

【问题讨论】:

  • test 是你自己的形象吗?如果是的话,你能分享一下 Dockerfile 吗?
  • 你认为-i选项有什么作用?

标签: python python-2.7 docker subprocess


【解决方案1】:

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

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

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

【讨论】:

    最近更新 更多