0

希望你能帮忙。我需要在我的 Python 脚本中运行带有特定图像(在我的例子中是 Fenics)的软件容器 Docker,然后向他传递一个命令来执行脚本。

我试过子流程:

   cmd1 = 'docker exec -ti -u fenics name_of_my_container /bin/bash -l'
    cmd2 = 'python2 shared/script_to_be_executed.py'
    process = subprocess.Popen(shlex.split(cmd1), 
              stdout=subprocess.PIPE,stdin=subprocess.PIPE, stderr = 
              subprocess.PIPE)
    process.stdin.write(cmd2)
    print(first_process.stdout.read())

但它什么也没做。建议?

4

2 回答 2

2

在您的通话中删除-it标志 do docker,您不想要它们。另外,不要尝试通过标准输入将要执行的命令发送到容器中,而只需传递命令以在您的调用中运行 do docker exec

我没有运行容器,所以我将使用它docker run,但下面的代码应该会给你一个线索:

import subprocess
cmd = 'docker run python:3.6.4-jessie python -c print("hello")'.split()
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
out, err = p.communicate()
print(out)

这将python -c print("hello")在容器中运行并捕获输出,因此 Python (3.6) 脚本将自行打印

b'hello\n'

它也适用于 Python 2.7,我不知道您在主机上使用的是哪个版本:)

关于与子进程通信,请参阅官方文档subprocess.Popen.communicate。从 Python 3.5 开始,还有subprocess.run,它让你的生活更加轻松。

于 2018-02-10T17:11:26.323 回答
0

您可以使用 subprocess 将 Fenics 作为应用程序调用,此处为第 4.4

docker run --rm -v $(pwd):/home/fenics/shared -w /home/fenics/shared quay.io/fenicsproject/stable "python3 my-code.py"
于 2020-03-27T09:30:11.730 回答