2016-03-15 3 views
2

Это кажется простым, но я пытаюсь повторить следующую команду Docker с помощью Dockerpy:Dockerpy выполнения команды в лог-файл кошачьей

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 --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 
+1

Это похоже на [эти] (https://github.com/docker/compose/issues/1275) [ошибки] (https://github.com/golang/go/issues/9763), которые должны иметь были исправлены. Какую версию Docker вы используете? – morxa

+0

@morxa добавил, не могу поверить, что я забыл добавить это! – enderland

+0

@JimB ошибка исходит из исходного кода Go самого Docker. Я не уверен, что изменение версии Go решит проблему или нет (см. [Эта ошибка в Go github] (https://github.com/golang/go/issues/9763)). – enderland

ответ

2

Докер-ру имеет 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']) 

Это потребуется до версии Go, что Докер построен против не включает this bug fix.

+0

yep полностью работает для меня тоже. –

Смежные вопросы