我正在尝试为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
,但是不会读取已经传输到父程序中的内容?