我想从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命令?谢谢!
答案 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