在docker中运行一个较长的命令

33 浏览
0 Comments

在docker中运行一个较长的命令

我正在使用Docker动态写入并运行文件。目前的命令类似于下面这样(仅用于测试想法):

docker run dockerfile/python cat <hi.txt && tail hi.txt
> hi there
> EOF

由于某种原因,这个命令没有输出任何内容。

如果我在没有HEREDOC的情况下运行此命令,它会输出结果。例如,以下命令有效:

docker run dockerfile/python cat > hi.txt && ls
hi.txt

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

0
0 Comments

问题的出现原因是在使用docker的过程中,当运行一个较长的命令时,可能会遇到一些问题。在这种情况下,需要使用特定的shell来运行命令,以确保命令在容器内部运行而不是在宿主机上运行。

解决方法是在docker命令中添加一个shell参数,例如使用bash来运行命令。这样可以确保命令在容器内部运行,并避免在宿主机上创建文件或执行其他操作。

例如,要在容器内部运行命令并在容器内部创建一个文件并列出目录内容,可以使用以下命令:

docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls'

另一种简单的测试方法是将容器作为沙箱使用。可以通过以下命令进入容器的shell环境:

docker run -it dockerfile/python bash

然后可以在容器的shell中执行各种操作和测试。一旦确定操作正常运行,可以将这些操作迁移到Dockerfile中进行后续操作。

通过使用特定的shell参数来运行更长的命令,以及使用容器作为沙箱进行测试,可以更好地管理和调试docker容器中的命令和操作。

0
0 Comments

在使用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 documents作为输入。

- 关于传递给`/bin/bash`的`-s`标志:

- 如果存在`-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

希望这对你有帮助。

更新

实际上,似乎甚至不需要使用`/bin/bash -s`,至少对于`crossbuild`容器来说是可以省略的,具体情况可能有所不同。

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

0