从docker运行更长的命令

时间:2014-12-09 01:49:19

标签: bash docker zsh dockerfile

我正在使用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的结果。

2 个答案:

答案 0 :(得分:3)

我很好奇,你使用了什么shell以便第二个命令有效?因为在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

然后只是在容器的shell中做东西。一旦我把事情搞好了,我就把我在Dockerfile中所做的事情向后移动了。

答案 1 :(得分:3)

我正在摆弄crossbuild *,并想知道如何使用 here documents 将命令传递给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将无法在交互式环境中运行,也不会接受来自stdin的here文档作为其输入
  • 关于传递给-s的{​​{1}}标志
      

    如果存在-s选项,或者选项后没有参数   处理,然后从标准输入读取命令。

  • /bin/bash,只有--volume $(pwd):/workdir会将主机上的当前工作目录挂载到容器中的-v
  • /workdir或简单--env CROSS_TRIPLE=x86_64-apple-darwin告诉-e容器有关目标平台和体系结构(容器的入口点是crossbuild,这是一个shell脚本并基于环境变量,它将正确的工具链组件符号链接到正确的位置,以便交叉编译工作)
  • /usr/bin/crossbuild要运行的Docker容器的名称(在Docker Hub中可用)

这些命令也可以像这样输入Docker。

multiarch/crossbuild

希望这会有所帮助。

更新

实际上,您似乎甚至不需要使用$ 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 ,它可以被省略,至少对于/bin/bash -s容器,YMMV。

*基于Linux的容器用于生成多目标二进制文件:Linux,Windows和OS X,非常酷。