从docker运行更长的命令

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

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的结果。

我很好奇,你使用了什么shell,以便第二个命令有效? 因为在bash中, hi.txt是在主机上创build的,所以是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' 

国际海事组织,最简单的方法来testing的东西是只使用一个容器作为沙箱:

 docker run -it dockerfile/python bash 

然后在那个容器的shell里做东西 一旦我的东西运行良好,我将我在Dockerfile中完成的事情回溯。

我正在摆弄crossbuild *,想知道如何使用这里的文档来将命令传递给Docker容器。 这是解决scheme。

 $ 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在完成执行时移除容器,否则会在输出--rm显示docker ps -a (当然不是必须使用的)
  • --interactive-i是必须的,否则/bin/bash将不会在交互式环境中运行,并且不会接受来自stdin的here文档作为其input
  • 关于传递给/bin/bash-s标志

    如果存在-s选项,或者在选项处理后没有任何参数,则从标准input中读取命令。

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

这些命令也可以像这样input到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 

希望这可以帮助。

更新

其实看起来你甚至不需要使用/bin/bash -s ,至less对于crossbuild容器YMMV来说可以忽略它。

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