【问题标题】:Running a longer command from docker从 docker 运行更长的命令
【发布时间】:2015-02-06 19:51:56
【问题描述】:

我正在使用 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 的结果。

【问题讨论】:

    标签: bash docker zsh dockerfile


    【解决方案1】:

    我在摆弄crossbuild* 并且想知道如何使用 here 文档 将命令通过管道传输到 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 将无法在交互式环境中运行,并且不会接受来自标准输入的此处文档作为其输入
    • 关于传递给/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容器,YMMV。

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

    【讨论】:

      【解决方案2】:

      我很好奇,您使用什么 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
      

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

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 2019-06-11
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多