我在摆弄crossbuild * 并且想知道如何使用此处的文档将命令通过管道传输到 Docker 容器。这是解决方案。
$ docker run --rm --interactive --volume $(pwd):/workdir --env CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s <<EOF
mkdir build && cd build
cmake ..
make
EOF
快速了解正在发生的事情。
--rm
告诉 Docker 在完成执行时删除容器,否则它将显示在输出中docker ps -a
(当然不是强制使用)
--interactive
,-i
是必需的,否则/bin/bash
将无法在交互式环境中运行,并且不会接受来自标准输入的此处文档作为其输入
- 关于
-s
传递给的标志/bin/bash
如果存在 -s 选项,或者在选项处理后没有保留任何参数,则从标准输入读取命令。
--volume $(pwd):/workdir
, 只是-v
将宿主机上的当前工作目录挂载到/workdir
容器中
--env CROSS_TRIPLE=x86_64-apple-darwin
,或者简单-e
地告诉crossbuild
容器目标平台和架构(容器的入口点是/usr/bin/crossbuild
,它是一个shell脚本,它基于环境变量将正确的工具链组件符号链接到正确的位置,以便交叉编译工作)
multiarch/crossbuild
要运行的 Docker 容器的名称(在 Docker Hub 中可用)
这些命令也可以像这样提供给 Docker。
$ cat a.sh
mkdir build && cd build
cmake ..
make
$ docker run --rm -i -v $(pwd):/workdir -e CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s < a.sh
希望这会有所帮助。
更新
Actually it seems you don't even need to use /bin/bash -s
, it can be ommited, at least for the crossbuild
container, YMMV.
*Linux based container used to produce multi-arch binaries: Linux, Windows and OS X, very cool.