将数据从主机传输到 docker 容器命令不适用于 docker 机器
Piping data from the host into docker container command not working with docker machine
我 运行 Docker 在 Windows 10 上使用 docker-machine 托管。我正在尝试使用此命令将主机中的数据通过管道传输到使用 'docker run' 生成的容器中:
echo test | docker run -i ubuntu:16.04 cat -
我希望此命令将 'test' 输出到标准输出,但它所做的只是打印一个空行:
jannis MINGW64 ~
$ echo test | docker run -i ubuntu:16.04 cat -
jannis MINGW64 ~
$
然而,当我 ssh 进入 docker-机器时,命令按预期工作:
jannis MINGW64 ~
$ docker-machine ssh
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.06.1-ce, build HEAD : 80114bc - Fri Aug 18 17:58:04 UTC 2017
Docker version 17.06.1-ce, build 874a737
docker@default:~$ echo test | docker run -i ubuntu:16.04 cat -
test
谁能告诉我:
- 为什么管道进入 docker-machine 中的容器不起作用?这是一个错误吗?
- 是否有解决此问题的解决方法(除了上面提供的解决方法 - ssh 进入 docker-machine VM)?
PS 我在我的 Windows 10 机器上使用 GitBash environment (based on MSYS2/MINGW)。版本信息:
jannis MINGW64 ~
$ uname -a
MINGW64_NT-10.0 jannis 2.6.1(0.306/5/3) 2017-01-14 09:41 x86_64 Msys
jannis MINGW64 ~
$ docker version
Client:
Version: 17.06.0-ce
API version: 1.30
Go version: go1.8.3
Git commit: 02c1d87
Built: Fri Jun 23 21:30:30 2017
OS/Arch: windows/amd64
Server:
Version: 17.06.1-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: 874a737
Built: Thu Aug 17 22:54:55 2017
OS/Arch: linux/amd64
Experimental: false
编辑 2-11-2017
原来是我使用的终端有问题(ConEmu). Or to be more exact the special case 在 Docker 的代码库中专用于 ConEmu。
按照 this comment 中建议的解决方法,我设法使管道正常工作:
As a workaround, disabling ConEmu Settings -> Features -> ANSI and xterm sequences
helped me.
相关链接:
- 我在 docker-机器上的票:https://github.com/docker/machine/issues/4235
- ConEmu 中的票证:https://github.com/Maximus5/ConEmu/issues/958
- Docker 中的票证:https://github.com/moby/moby/issues/28814
原始答案
我已经在 docker-machine
的问题跟踪器中发布了 a bug,我们看看他们怎么说。
目前我已经找到了解决方法。我正在保存我想要传输到本地文件的有效负载,然后使用 docker cp
将文件传输到容器中,然后在容器中本地传输它。
总结一下:
我想做但不适用于 docker-machine
的是:
echo piped content | docker run -i ubuntu:16.04 cat -
相反,我这样做:
jannis MINGW64 ~
$ docker create --name test-container ubuntu:16.04 sh -c 'cat - < /tmp/emulatedpipe'
a6eaf1e5f143113bcffa9df66a47b37c124cd34447b670480b5f096d45b7b162
jannis MINGW64 ~
$ echo piped content > emulatedpipe
jannis MINGW64 ~
$ docker cp emulatedpipe test-container:/tmp
jannis MINGW64 ~
$ docker start -i test-container
piped content
我 运行 Docker 在 Windows 10 上使用 docker-machine 托管。我正在尝试使用此命令将主机中的数据通过管道传输到使用 'docker run' 生成的容器中:
echo test | docker run -i ubuntu:16.04 cat -
我希望此命令将 'test' 输出到标准输出,但它所做的只是打印一个空行:
jannis MINGW64 ~
$ echo test | docker run -i ubuntu:16.04 cat -
jannis MINGW64 ~
$
然而,当我 ssh 进入 docker-机器时,命令按预期工作:
jannis MINGW64 ~
$ docker-machine ssh
## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\_______/
_ _ ____ _ _
| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 17.06.1-ce, build HEAD : 80114bc - Fri Aug 18 17:58:04 UTC 2017
Docker version 17.06.1-ce, build 874a737
docker@default:~$ echo test | docker run -i ubuntu:16.04 cat -
test
谁能告诉我:
- 为什么管道进入 docker-machine 中的容器不起作用?这是一个错误吗?
- 是否有解决此问题的解决方法(除了上面提供的解决方法 - ssh 进入 docker-machine VM)?
PS 我在我的 Windows 10 机器上使用 GitBash environment (based on MSYS2/MINGW)。版本信息:
jannis MINGW64 ~
$ uname -a
MINGW64_NT-10.0 jannis 2.6.1(0.306/5/3) 2017-01-14 09:41 x86_64 Msys
jannis MINGW64 ~
$ docker version
Client:
Version: 17.06.0-ce
API version: 1.30
Go version: go1.8.3
Git commit: 02c1d87
Built: Fri Jun 23 21:30:30 2017
OS/Arch: windows/amd64
Server:
Version: 17.06.1-ce
API version: 1.30 (minimum version 1.12)
Go version: go1.8.3
Git commit: 874a737
Built: Thu Aug 17 22:54:55 2017
OS/Arch: linux/amd64
Experimental: false
编辑 2-11-2017
原来是我使用的终端有问题(ConEmu). Or to be more exact the special case 在 Docker 的代码库中专用于 ConEmu。
按照 this comment 中建议的解决方法,我设法使管道正常工作:
As a workaround, disabling
ConEmu Settings -> Features -> ANSI and xterm sequences
helped me.
相关链接:
- 我在 docker-机器上的票:https://github.com/docker/machine/issues/4235
- ConEmu 中的票证:https://github.com/Maximus5/ConEmu/issues/958
- Docker 中的票证:https://github.com/moby/moby/issues/28814
原始答案
我已经在 docker-machine
的问题跟踪器中发布了 a bug,我们看看他们怎么说。
目前我已经找到了解决方法。我正在保存我想要传输到本地文件的有效负载,然后使用 docker cp
将文件传输到容器中,然后在容器中本地传输它。
总结一下:
我想做但不适用于 docker-machine
的是:
echo piped content | docker run -i ubuntu:16.04 cat -
相反,我这样做:
jannis MINGW64 ~
$ docker create --name test-container ubuntu:16.04 sh -c 'cat - < /tmp/emulatedpipe'
a6eaf1e5f143113bcffa9df66a47b37c124cd34447b670480b5f096d45b7b162
jannis MINGW64 ~
$ echo piped content > emulatedpipe
jannis MINGW64 ~
$ docker cp emulatedpipe test-container:/tmp
jannis MINGW64 ~
$ docker start -i test-container
piped content