使用sh管道时使用"docker-compose"时出错(echo"docker-compose ..."| sh)

key*_*olk 9 python pipe sh docker docker-compose

我的应用程序有多个容器.为了方便安装,我决定使用包装图像.我期望的是下面的内容

$ docker run my_application install | sh 
Run Code Online (Sandbox Code Playgroud)

- >从注册表中提取所有相关图像

$ docker run my_application up | sh
Run Code Online (Sandbox Code Playgroud)

- >做一些初始工作和所有容器

但我坚持以下问题.

$ echo "docker-compose exec cassandra cqlsh -e 'desc keyspaces'" | sh
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 57, in main
  File "compose/cli/main.py", line 108, in perform_command
  File "compose/cli/main.py", line 353, in exec_command
  File ".tox/py27/lib/python2.7/site-packages/dockerpty/pty.py", line 338, in start
  File ".tox/py27/lib/python2.7/site-packages/dockerpty/io.py", line 32, in set_blocking
ValueError: file descriptor cannot be a negative integer (-1)
docker-compose returned -1
Run Code Online (Sandbox Code Playgroud)

从docker-compose引发的错误.当尝试如下,它运作良好.

$ echo "docker exec my_application_cassandra_1 cqlsh -e 'desc keyspaces'" | sh

system_traces  system

$ sh -c "docker-compose exec cassandra cqlsh -e 'desc keyspaces'"

system_traces  system
Run Code Online (Sandbox Code Playgroud)

但当我使用管道与docker-compose时,它总是把错误.

有人知道我怎么能处理这个吗?

Dom*_*nck 12

这是docker-compose中的一个漏洞.

作为解决方法,您可以将-T选项传递给docker-compose exec:

$ docker-compose exec --help
[...]
-T                Disable pseudo-tty allocation. By default `docker-compose exec`
                  allocates a TTY.
Run Code Online (Sandbox Code Playgroud)