docker中的文件描述符重定向

Posted

技术标签:

【中文标题】docker中的文件描述符重定向【英文标题】:file descriptor redirection in docker 【发布时间】:2019-12-26 10:11:34 【问题描述】:

我希望能够在不破坏标准输入的情况下将一些内容通过管道传输到 docker 进程中。

我想我可以通过在生成 docker 进程之前在 bash 中打开一个新的文件描述符来做到这一点,然后在 docker 进程中使用这个描述符。但是它不起作用

码头外:

exec 4<>somefile.txt
docker run --rm -i image cmd args > output.txt

码头内部:

exec 4>file.txt # also tried without the exec
do something with file.txt

docker 容器在到达4&gt;file.txt 行时停止。

它必须是一个原子动作,所以我不能使用docker cp 或类似的东西。 另外,docker 镜像没有暴露任何网络端口,所以不能使用 netcat。 我宁愿不使用任何复杂的 docker mounts。

STDIN 是其他用途所必需的,所以我不能破坏它

是否有任何其他选项可以将文件内容放入临时容器中以使用单个命令?

【问题讨论】:

docker run -v file.txt ? 好的,挂载语法没有我想象的那么复杂! 这不起作用。 -v 总是在容器中创建一个目录,而不是一个文件 【参考方案1】:

这里通常的做法是将当前目录挂载到容器中。您可以选择容器内的任何目录名称,并应尽量避免使用挂载隐藏脚本本身。

docker run --rm -i -v $PWD:/data image \
  cmd -i /data/file.txt -o /data/output.txt --other-args

文件系统权限可能很棘手,在这方面:你可以在-v选项的前半部分命名任何目录,甚至像/etc这样的系统目录;如果容器内的进程以非 root 用户身份运行,则可能无法读取挂载目录中的文件。

您可以bind-mount 文件或目录,但需要注意的是它们必须首先存在于主机上,否则 Docker 将为您创建一个目录(即使您想要一个文件;并且可能由 root 和不是您的本地用户)。

【讨论】:

出于安全原因,在我的情况下挂载当前目录不起作用,但我认为创建一个临时目录和挂载将是可行的方法

以上是关于docker中的文件描述符重定向的主要内容,如果未能解决你的问题,请参考以下文章

管道符重定向和环境变量

管道符重定向与环境变量

Linux管道符重定向与环境变量

管道符重定向与环境变量

管道符重定向与环境变量

管道符重定向与环境变量