当我通过管道与 sh 一起使用时 "docker-compose" 出错( echo "docker-compose... " | sh )
Error on "docker-compose" when I use by pipe with sh ( echo "docker-compose... " | sh )
我有一个具有多容器的应用程序。
为了方便安装,我决定使用打包镜像。
我的预期如下所示
$ docker run my_application install | sh
-> 从注册表中提取所有相关图像
$ docker run my_application up | sh
-> 做一些初始工作并启动所有容器
但我遇到了以下问题。
$ 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
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
但是当我使用带有 docker-compose 的管道时
它总是把错误。
有人知道我该如何处理吗?
这是 docker-compose 中的 open bug。
作为解决方法,您可以将 -T
选项传递给 docker-compose exec
:
$ docker-compose exec --help
[...]
-T Disable pseudo-tty allocation. By default `docker-compose exec`
allocates a TTY.
我在尝试使用以下命令从 postgres 导出时遇到同样的问题:
docker-compose exec postgres pg_dumpall -U postgres | gzip > file.gz
将 -T
选项添加到 exec
没有帮助,因为它会阻止管道工作。 (实际上,我不确定 pg_dumpall 命令是否运行,但它不会出错)
临时解决方案是使用docker本身,因此您需要更改命令和容器名称,如:
docker exec fullname_postgres_1 pg_dumpall -U postgres | gzip > file.gz
我有一个具有多容器的应用程序。 为了方便安装,我决定使用打包镜像。 我的预期如下所示
$ docker run my_application install | sh
-> 从注册表中提取所有相关图像
$ docker run my_application up | sh
-> 做一些初始工作并启动所有容器
但我遇到了以下问题。
$ 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
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
但是当我使用带有 docker-compose 的管道时 它总是把错误。
有人知道我该如何处理吗?
这是 docker-compose 中的 open bug。
作为解决方法,您可以将 -T
选项传递给 docker-compose exec
:
$ docker-compose exec --help
[...]
-T Disable pseudo-tty allocation. By default `docker-compose exec`
allocates a TTY.
我在尝试使用以下命令从 postgres 导出时遇到同样的问题:
docker-compose exec postgres pg_dumpall -U postgres | gzip > file.gz
将 -T
选项添加到 exec
没有帮助,因为它会阻止管道工作。 (实际上,我不确定 pg_dumpall 命令是否运行,但它不会出错)
临时解决方案是使用docker本身,因此您需要更改命令和容器名称,如:
docker exec fullname_postgres_1 pg_dumpall -U postgres | gzip > file.gz