从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,非常酷。