Python 2.7.10,Docker版本18.03.1-ce-mac65(24312)
我可能对docker exec_run命令的工作方式缺乏了解,但是我正在努力使其工作。以下代码可以正常工作
from __future__ import print_function
import docker
if __name__ == '__main__':
client = docker.from_env()
image = client.images.pull('oraclelinux:7')
container = client.containers.run('oraclelinux:7',
command='ls',
stderr=True,
stdout=True,
auto_remove=False,
remove=False,
detach=True
)
log = container.logs(stdout=True, stderr=True, stream=True)
for line in log:
print(line, end='')
container.stop()
print(container.status)
container.remove()
并返回根目录中的目录列表。但是,我原本希望的等效方法失败了。
from __future__ import print_function
import docker
if __name__ == '__main__':
client = docker.from_env()
image = client.images.pull('oraclelinux:7')
container = client.containers.create('oraclelinux:7',
command='/bin/bash',
auto_remove=False)
container.start()
log = container.exec_run('ls',
stderr=True,
stdout=True,
detach=True)
for line in log:
print(line, end='')
container.stop()
print(container.status)
container.remove()
有以下错误
/Users/user/PythonVirtualEnv/bin/python "/Users/user/DockerAutomation.py"
Traceback (most recent call last):
File "/Users/user/DockerAutomation.py", line 16, in <module>
detach=True)
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/models/containers.py", line 185, in exec_run
resp['Id'], detach=detach, tty=tty, stream=stream, socket=socket
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/utils/decorators.py", line 19, in wrapped
return f(self, resource_id, *args, **kwargs)
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/api/exec_api.py", line 162, in exec_start
return self._result(res)
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/api/client.py", line 231, in _result
self._raise_for_status(response)
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/api/client.py", line 227, in _raise_for_status
raise create_api_error_from_http_exception(e)
File "/Users/user/PythonVirtualEnv/lib/python2.7/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
raise cls(e, response=response, explanation=explanation)
docker.errors.APIError: 500 Server Error: Internal Server Error ("OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "process_linux.go:86: executing setns process caused \"exit status 21\"": unknown")
谁能对我可能做错的事情提供任何见解?
编辑:虽然Ignacio回答了这个问题,但我添加了另一个答案,该答案更接近于我想做的事情(针对一个打开的容器运行多个命令并输出输出)。
我认为问题出在exec_run方法的参数detach = True 。
将其设置为true时,将执行命令,但Docker客户端不会附加到输出。
我在测试时发现了另一个问题,使用命令/ bin / bash运行容器会导致容器在到达exec_run之前就结束了。
这个脚本对我有用:
from __future__ import print_function
import docker
if __name__ == '__main__':
client = docker.from_env()
image = client.images.pull('oraclelinux:7')
container = client.containers.create('oraclelinux:7',
command='sleep 10000',
auto_remove=False)
container.start()
log = container.exec_run('ls',
stderr=True,
stdout=True)
for line in log:
print(line, end='')
container.stop()
print(container.status)
container.remove()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句