docker run -i和/ dev / stdin

时间:2018-03-10 08:52:42

标签: bash docker stdin

我正在尝试为docker run创建一个包装器(实际上是docker exec,但是docker run是一个更好的例子),你可以根据需要管道数据。

包装器的工作原理如下:

$ cat cat.sh
#! /usr/bin/env bash
docker run -i ubuntu:14.04 cat $@ < /dev/stdin

有趣的是,如果制作另一个调用此脚本的scirpt,然后将一些东西输入脚本中的父脚本,则子脚本会读取它!

以下是详细信息:

当我使用此脚本明确地将某些内容传递到cat.sh时,它会执行我认为会执行的操作。

$ cat example2.sh 
#! /usr/bin/env bash
set -e
echo OK | ./cat.sh
echo now show the stuff that was piped into _this_ program
cat < /dev/stdin

$ echo this is a test | ./example2.sh 
OK
now show the stuff that was piped into _this_ program
this is a test

然而,当我没有将任何东西输入cat.sh时,它没有按照我的想法行事。

$ cat example1.sh 
#! /usr/bin/env bash
set -e
./cat.sh etc/timezone
echo now show the stuff that was piped into _this_ program
cat < /dev/stdin

$ echo this is a test | ./example1.sh 
Etc/UTC
now show the stuff that was piped into _this_ program

我以为我会看到这个

$ echo this is a test | ./example1.sh 
Etc/UTC
now show the stuff that was piped into _this_ program
this is a test

当我从-i移除docker run时,example1.sh按照我的希望工作,但example2.sh没有。

当我用docker run -i ubuntu:14.04 cat $@ < /dev/stdin替换cat $@ < /dev/stdin时,一切都按预期工作。

-i做什么是允许它读取父程序的标准输入? 有没有办法在没有泊坞工的情况下重现这个?

是否有办法编写cat.sh,以便在将某些内容专门用于管道传输时将stdin传递给docker run,但是不会读取已经传输到父程序中的内容?

0 个答案:

没有答案