Running the same task on the debian based image of python 2.7.13 doesn't cause the problem.
from invoke import task
@task
def foo(ctx, pty=False):
ctx.config.run.shell = '/bin/sh'
ctx.run("/bin/uname -a", pty=pty)
docker run -it --rm -v `pwd`/tasks.py:/tasks.py python:2.7.13-alpine /bin/sh -c "pip install invoke && cd / && invoke foo --pty"
Collecting invoke
Downloading invoke-0.21.0-py2-none-any.whl (154kB)
100% |████████████████████████████████| 163kB 1.0MB/s
Installing collected packages: invoke
Successfully installed invoke-0.21.0
Linux 8ed453c901c2 4.9.49-moby #1 SMP Wed Sep 27 23:17:17 UTC 2017 x86_64 Linux
Traceback (most recent call last):
File "/usr/local/bin/invoke", line 11, in <module>
sys.exit(program.run())
File "/usr/local/lib/python2.7/site-packages/invoke/program.py", line 293, in run
self.execute()
File "/usr/local/lib/python2.7/site-packages/invoke/program.py", line 414, in execute
executor.execute(*self.tasks)
File "/usr/local/lib/python2.7/site-packages/invoke/executor.py", line 129, in execute
result = call.task(*args, **call.kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/tasks.py", line 115, in __call__
result = self.body(*args, **kwargs)
File "/tasks.py", line 7, in foo
ctx.run("/bin/uname -a", pty=pty)
File "/usr/local/lib/python2.7/site-packages/invoke/context.py", line 82, in run
return self._run(runner, command, **kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/context.py", line 89, in _run
return runner.run(command, **kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 262, in run
return self._run_body(command, **kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 356, in _run_body
raise ThreadException(thread_exceptions)
invoke.exceptions.ThreadException:
Saw 1 exceptions within threads (OSError):
Thread args: {'kwargs': {'buffer_': [u'Linux 8ed453c901c2 4.9.49-moby #1 SMP Wed Sep 27 23:17:17 UTC 2017 x86_64 Linux\r\n'],
'hide': False,
'output': <open file '<stdout>', mode 'w' at 0x7f069f8ac150>},
'target': <bound method Local.handle_stdout of <invoke.runners.Local object at 0x7f069c8b66d0>>}
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/invoke/util.py", line 202, in run
super(ExceptionHandlingThread, self).run()
File "/usr/local/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 550, in handle_stdout
reader=self.read_proc_stdout,
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 515, in _handle_output
for data in self.read_proc_output(reader):
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 490, in read_proc_output
data = reader(self.read_chunk_size)
File "/usr/local/lib/python2.7/site-packages/invoke/runners.py", line 916, in read_proc_stdout
data = os.read(self.parent_fd, num_bytes)
OSError: [Errno 5] I/O error
If pty is disabled, it works.
docker run -it --rm -v `pwd`/tasks.py:/tasks.py python:2.7.13-alpine /bin/sh -c "pip install invoke && cd / && invoke foo"
If used the debian based image, it works regardless.
docker run -it --rm -v `pwd`/tasks.py:/tasks.py python:2.7.13 /bin/sh -c "pip install invoke && cd / && invoke foo --pty"
I'm trying to run invoke in a docker container with the official
python:2.7.13-alpineimage and running in toOSError: [Errno 5] I/O errorwhenever invoke tries to execute an external command usingctx.run(cmd, pty=True).Running the same task on the debian based image of python 2.7.13 doesn't cause the problem.
Steps to reproduce.
create a dummy tasks.py
run the docker container (fails)
If pty is disabled, it works.
If used the debian based image, it works regardless.
My guess is that musl compiled python returns different exception string than the gcc one and doesn't get trapped here: https://github.com/pyinvoke/invoke/blob/master/invoke/runners.py#L918-L920