Docker中的文件描述符重定向

3

我希望能够将一些内容输入到Docker进程中,而不会破坏其stdin。

我认为我可以在生成Docker进程之前在bash中打开一个新文件描述符,然后在Docker进程中使用该描述符。然而这并不起作用。

Docker外:

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

在Docker容器内:

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

当docker容器到达4>file.txt行时停止。

由于这必须是一个原子操作,所以我不能使用docker cp或其他类似的工具。 而且,docker映像没有公开任何网络端口,因此无法使用Netcat。 我不想使用任何复杂的docker挂载。

STDIN用于其他用途,所以我不能破坏它

是否有其他选项将文件内容传输到临时容器以供单个命令使用?


1
docker run -v file.txt ? - KamilCuk
好的,挂载语法并不像我想象的那么复杂! - DJL
这个不起作用。-v 选项总是在容器中创建一个目录,而不是一个文件。 - DJL
1个回答

0
通常的做法是将当前目录挂载到容器中。您可以选择容器内的任何目录名称,并应尽量避免使用挂载隐藏脚本本身。
docker run --rm -i -v $PWD:/data image \
  cmd -i /data/file.txt -o /data/output.txt --other-args

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

您可以绑定挂载文件或目录,但有一个限制条件,即它们必须首先存在于主机上,否则Docker将为您创建一个目录(即使您想要一个文件;并且可能由root拥有而不是您的本地用户)。


由于安全原因,将当前目录挂载不适用于我的情况,但我认为创建一个临时目录并将其挂载将是解决问题的方法。 - DJL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接