bash - docker中的文件描述符重定向

标签 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 或类似的东西。 此外,docker 镜像不暴露任何网络端口,因此无法使用 netcat。 我宁愿不使用任何复杂的 docker 挂载。

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

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

最佳答案

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

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

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

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

关于bash - docker中的文件描述符重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57586409/

相关文章:

bash - 使用 shell 脚本替换文件中两个特定脚本之间的字符串

docker - 群-正确完成服务更新

docker - 使用单个docker swarm节点作为外部 Bootstrap

python - 将嵌入式 Python IO 重定向到使用 AllocConsole 创建的控制台

windows - 如何使用 wintee 仅重定向 STDERR?

BASH - 随机播放文件中字符串中的字符

bash - 遍历 bash 脚本中的参数并使用它们的数字

mysql - 将 docker 容器连接到本地工作台 MySQL DB

powershell - 将输出流以外的两个或多个 Powershell 流重定向到同一文件

linux - 我的 bash 脚本有问题