我正在使用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的结果。
答案 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,非常酷。