8

我正在使用 Docker 即时编写文件并运行它。到目前为止,该命令看起来像这样(只是为了首先测试这个想法):

docker run dockerfile/python cat <<EOF >hi.txt && tail hi.txt
> hi there
> EOF

出于某种原因,这并没有回应任何东西。

如果我在没有 HEREDOC 的情况下运行此命令,那么它会输出结果。例如以下作品:

docker run dockerfile/python cat > hi.txt && ls
hi.txt

如何输出多行运行命令/HEREDOC 的结果。

4

2 回答 2

4

我在摆弄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.

于 2016-03-03T09:05:36.473 回答
3

我很好奇,您使用什么外壳才能使第二个命令起作用?因为在 bash 中hi.txt是在主机上创建的,所以ls.

bash-3.2$ docker run --rm dockerfile/python cat > hi.txt && ls
Applications    Desktop     Documents   Downloads   Dropbox     Library     Movies      Music       Pictures    Public      VirtualBox VMs  hi.txt      projects

为此,我必须使用:

docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls'

IMO,测试东西的最简单方法是将容器用作沙箱:

docker run -it dockerfile/python bash

然后在那个容器的外壳中做一些事情。一旦我让事情运行良好,我就会将我在 Dockerfile 中所做的事情反向移植。

于 2014-12-09T11:13:46.103 回答