Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/function/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 在容器化CLI和主机之间共享文件_Docker_Containers_Command Line Interface - Fatal编程技术网

Docker 在容器化CLI和主机之间共享文件

Docker 在容器化CLI和主机之间共享文件,docker,containers,command-line-interface,Docker,Containers,Command Line Interface,我需要容器化一个既有CLI,该CLI还可以读取和写入文件。类似于containerizedcp或kubectl的任何其他典型bash命令 是否有方法包装docker命令以启用对主机系统上文件的访问 cat my_wrapper.sh: #!/bin/bash if [ "$#" -ne 1 ]; then echo "Illegal number of parameters" exit 1 else if [ -f "$1" ]; then dir=$(

我需要容器化一个既有CLI,该CLI还可以读取和写入文件。类似于containerizedcp或kubectl的任何其他典型bash命令

是否有方法包装docker命令以启用对主机系统上文件的访问

cat my_wrapper.sh:

#!/bin/bash

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
    exit 1
else
    if [ -f "$1" ]; then
        dir=$(dirname "$1")
    else
        echo "File doesn't exist"
        exit 2
    fi
fi

IMAGE=xxxx

docker run --rm -it -v "$dir":"$dir" \
    "$IMAGE" \
    "$1"
!/垃圾箱/垃圾箱 docker run-rm-it-v\ $IMAGE\ $@ 是否有一种方法可以挂载任何东西,使my_wrapper.sh可以读取和写入文件,如my_wrapper.sh-option/some/file/argument

澄清

当然,您可以简单地装载文件所在的路径,但是:

如何保持参数正常工作?尤其是绝对路径。 如何避免为类似文件的名称解析命令行?
事实上,您可以通过以下方式实现:

$my_wrapper.sh/some/file/argument

my_wrapper.sh的内容:

#!/bin/bash

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
    exit 1
else
    if [ -f "$1" ]; then
        dir=$(dirname "$1")
    else
        echo "File doesn't exist"
        exit 2
    fi
fi

IMAGE=xxxx

docker run --rm -it -v "$dir":"$dir" \
    "$IMAGE" \
    "$1"

作为一个隔离系统,Docker按设计将容器和主机文件系统分开,而且它更面向服务器类型的程序,通常需要root权限才能执行任何操作。我不会尝试在Docker中运行简单的CLI程序-将您已经编写的脚本与您作为示例提供的单个word命令进行比较。@DavidMaze没错,我正在将复杂系统封装到容器中。不幸的是,这个复杂的系统还附带了自己的CLI,这并不意味着CLI必须在容器中运行。您提到了kubectl,这是一个很好的例子:大多数Kubernetes在容器中运行,但CLI工具本身通常作为非容器独立工具运行。@DavidMaze Right。如果我们在这里找不到解决方案,那么将其安装到主机上就是备份计划。如果你想把它转换成一个答案的话,我会投票赞成。通过神奇地将目录推断为/some/file/这是一个简单的答案,但这只适用于这个例子。我将澄清问题您希望根据作为参数传递给包装器的文件的位置动态设置bindmount卷吗?