从docker运行更长的命令

Joh*_*ton 6 bash zsh docker dockerfile

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

docker run dockerfile/python cat <<EOF >hi.txt && tail hi.txt
> hi there
> EOF
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不会回应任何事情.

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

docker run dockerfile/python cat > hi.txt && ls
hi.txt
Run Code Online (Sandbox Code Playgroud)

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

Koh*_*ert 9

我正在摆弄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
Run Code Online (Sandbox Code Playgroud)

快速概述正在发生的事情。

  • --rm告诉 Docker 在执行完成后删除容器,否则它将显示在输出中docker ps -a(当然不是强制使用)
  • --interactive,-i是必需的,否则/bin/bash将无法在交互式环境中运行,并且不会接受来自 stdin 的此处文档作为其输入
  • 关于-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
Run Code Online (Sandbox Code Playgroud)

希望这有帮助。

更新

实际上似乎你甚至不需要使用/bin/bash -s,它可以被省略,至少对于crossbuild容器来说,YMMV。

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


小智 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
Run Code Online (Sandbox Code Playgroud)

为了实现这一点,我必须使用:

docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls'
Run Code Online (Sandbox Code Playgroud)

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

docker run -it dockerfile/python bash
Run Code Online (Sandbox Code Playgroud)

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