macos - Dockerpy 执行命令到 cat 日志文件

标签 macos python-2.7 docker dockerpy

这看起来很简单,但我正在尝试使用 Docker-py 复制以下 Docker 命令:

docker exec dockerName cat /var/log/foo.log

使用 dockerpy,似乎以下内容应该有效:

from docker.client import Client
from docker.utils import kwargs_from_env
cli = Client(**kwargs_from_env())

print kwargs_from_env()

name_one = 'exec_container'
cli.create_container(**{'name': name_one, 'image': 'golang'})
cli.start(name_one)
cli.logs(name_one, stdout=True, stderr=True)  # commenting this line out allows the below to execute perfectly

e = cli.exec_create(container=name_one, cmd='ls /usr/local/bin')
print cli.exec_start(exec_id=e['Id'])

但是,当我运行此命令时,我收到以下错误跟踪:

  File "/Library/Python/2.7/site-packages/docker/utils/decorators.py", line 35, in wrapper
    return f(self, *args, **kwargs)
  File "/Library/Python/2.7/site-packages/docker/api/exec_api.py", line 75, in exec_start
    return self._get_result_tty(stream, res, tty)
  File "/Library/Python/2.7/site-packages/docker/client.py", line 311, in _get_result_tty
    self._raise_for_status(res)
  File "/Library/Python/2.7/site-packages/docker/client.py", line 146, in _raise_for_status
    raise errors.APIError(e, response, explanation=explanation)
docker.errors.APIError: 500 Server Error: Internal Server Error ("http: Hijack is incompatible with use of CloseNotifier")

我不太确定我做错了什么或者需要对 docker-py 做不同的事情。完成上述操作后,我可以立即执行命令行命令。

所有内容的版本:

docker --version
Docker version 1.10.0, build 590d5108

docker-machine --version
docker-machine version 0.6.0, build e27fb87

pip freeze | grep docker-py
docker-py==1.7.2

最佳答案

Docker-py 有一个 bug or unexpected behavior in this situation .

临时解决方案是实例化一个新客户端,然后您可以执行以下操作:

from docker.client import Client
from docker.utils import kwargs_from_env
cli = Client(**kwargs_from_env())

print kwargs_from_env()
name_one = 'exec_container'

cli.create_container(**{'name': name_one, 'image': 'golang'})
cli.start(name_one)
cli.logs(name_one, stdout=True, stderr=True)

cli2 = Client(**kwargs_from_env())

e = cli2.exec_create(container=name_one, cmd='ls /usr/local/bin')
print cli2.exec_start(exec_id=e['Id'])

在 docker 构建的 Go 版本包含 this bug fix 之前,这将是必需的。 .

关于macos - Dockerpy 执行命令到 cat 日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36017397/

相关文章:

c++ - 如何在没有任何断言的情况下构建 imagemagick

python - 在 python 中使用 2D 列表的优雅方式

python - 如何将python数组(data = [])写入excel?

python - 组合具有相同列值的 pandas DataFrame 的最有效方法

python - Fluentd 发布到标准输出但不发布到 Elasticsearch

docker - 为什么打印不能与异步生成器一起正常工作?

macos - 如何从 PowerShell 脚本打开另一个 PowerShell 控制台

c++ - LLVM 编译器优化导致 bool 类成员的逻辑中断

macos - R: Mac/OSX 上复制到剪贴板的功能?

java - 无论 RAM 大小或 docker 配置,我都会收到警告 "Container memory limit unset. Configuring JVM for 1G container."