在docker中运行一个较长的命令
问题的出现原因是在使用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容器中的命令和操作。
在使用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,非常酷。