如何从python运行docker命令?

时间:2018-09-10 16:56:43

标签: python docker

我想从python运行一组docker命令。 我尝试创建如下所示的脚本,然后使用paramiko ssh_client从python运行该脚本以连接到运行docker的计算机:

#!/bin/bash

   # Get container ID
   container_id="$(docker ps | grep hello | awk '{print $1}')"

   docker exec -it $container_id sh -c "cd /var/opt/bin/ && echo $1 && 
   echo $PWD && ./test.sh -q $1"

但是docker exec ...从未执行。

所以我尝试直接在运行docker的机器上运行以下python脚本:     导入子进程

docker_run = "docker exec 7f34a9c1b78f /bin/bash -c \"cd 
/var/opt/bin/ && ls -a\"".split()
subprocess.call(docker_run, shell=True)

我收到一条消息:“用法:docker COMMAND ...”

但是如果我运行命令

,我会得到预期的结果
  
    

docker exec 7f34a9c1b78f / bin / bash -c“ cd / var / opt / bin / && ls -a”     直接在机器中

  

如何从python脚本运行多个docker命令?谢谢!

2 个答案:

答案 0 :(得分:0)

致电subprocess.call时出错。 subprocess.call需要一个带有一系列参数的命令。您已经给它提供了参数清单。

此代码:

docker_run = "docker exec 7f34a9c1b78f /bin/bash -c \"cd 
/var/opt/bin/ && ls -a\"".split()
subprocess.call(docker_run, shell=True)

运行此:

subprocess.call([
   'docker', 'exec', '7f34a9c1b78f', '/bin/bash', '-c', 
   '"cd', '/var/opt/bin/', '&&', 'ls', '-a"'
 ], shell=True)

相反,我相信你想要

subprocess.call([
   'docker', 'exec', '7f34a9c1b78f', '/bin/bash', '-c', 
   '"cd /var/opt/bin/ && ls -a"' # Notice how this is only one argument.
 ], shell=True)

您可能需要调整第二个电话。我怀疑您不需要引号('cd /var/opt/bin/ && ls -a'可能会代替'"cd /var/opt/bin/ && ls -a"',但我尚未对其进行测试。

答案 1 :(得分:0)

以下是一些可行的方法: 删除双引号:

  
    

subprocess.call(['docker','exec','7f34a9c1b78f','/ bin / bash','-c','cd / opt / teradata / tdqgm / bin / && ./support-archive。 sh -q 6b171e7a-7071-4975-a3ac-000000000241'])

  

如果不确定如何拆分命令以将其作为子流程方法的参数传递,请使用shlex模块: https://docs.python.org/2.7/library/shlex.html#shlex.split