我希望能够将一些内容通过管道传输到 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/