docker中的文件描述符重定向

时间:2019-08-21 07:19:35

标签: bash docker io-redirection

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

我想我可以通过在生成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或类似的东西。 另外,泊坞窗映像不会公开任何网络端口,因此无法使用netcat。 我宁愿不使用任何复杂的Docker挂载。

其他目的还需要STDIN,所以我不能破坏

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

1 个答案:

答案 0 :(得分:0)

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

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

文件系统权限可能很棘手,在这两个方面:您可以在-v选项的前半部分命名 any 目录,甚至是/etc之类的系统目录;并且如果容器中的进程以非root用户身份运行,则可能无法读取装入目录中的文件。

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