在Docker中运行一个更长的命令

9

我正在使用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个回答

9

我正在尝试使用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 document。 - 关于传递给 `/bin/bash` 的 `-s` 标志
> 如果存在 `-s` 选项或者在选项处理后没有剩余的参数,则命令从标准输入读取。
- `--volume $(pwd):/workdir`,只使用 `-v` 将主机上的当前工作目录挂载到容器中的 `/workdir`。 - `--env CROSS_TRIPLE=x86_64-apple-darwin` 或简单地使用 `-e` 告诉 `crossbuild` 容器有关目标平台和架构的信息(容器的入口点为 `/usr/bin/crossbuild`,它是一个 shell 脚本,根据环境变量在正确的位置为交叉编译符号链接正确的 toolchain 组件)。 - `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

更新

事实上,对于 crossbuild 容器来说,似乎甚至不需要使用 /bin/bash -s,可以省略。这个容器是基于 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

为了实现这一点,我需要使用以下内容:
docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls'

我认为测试东西最简单的方法就是将容器用作沙盒:

docker run -it dockerfile/python bash

然后在该容器的 shell 中进行操作。一旦我成功运行,我就会将所做的内容回溯到 Dockerfile 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接