【问题标题】:How to send a command properly into docker container?如何将命令正确发送到 docker 容器中?
【发布时间】:2022-01-06 15:24:36
【问题描述】:

我可以在终端中成功执行以下命令。
command:

gdalwarp -s_srs "+datum=WGS84 +no_defs +geoidgrids=egm96-15.gtx" -t_srs "+datum=WGS84 +no_def" input.tif output.tif

现在,我想将这个命令存储到一个变量中,并在一个 docker 容器中展开这个命令。

我的脚本run.sh 如下所示。我首先将我的目标命令存储到mycommand 并以命令作为输入运行容器。

mycommand=$@;
docker run -ti --rm osgeo/gdal:ubuntu-small-latest /bin/bash -c "cd $(pwd); ${mycommand}"

然后我执行run.sh 如下。

bash run.sh gdalwarp -s_srs "+datum=WGS84 +no_defs +geoidgrids=egm96-15.gtx" -t_srs "+datum=WGS84 +no_def" input.tif output.tif

问题:

  1. 我希望 bash run.sh 之后的所有内容都可以按字面意思存储到 mycommand 变量中。
  2. 在 docker 容器内,mycommand 可以按字面意思展开和执行。但看起来我原来的命令中的双引号会在这个过程中丢失。

谢谢。

【问题讨论】:

  • "cd $(pwd); 这很奇怪,你为什么要 cd 到与主机上的beeing 相同的目录?
  • @KamilCuk 容器内的目录结构和我的主机一样。所以,我希望容器内的工作目录与我的主机相同。

标签: bash docker shell syntax double-quotes


【解决方案1】:

您可以将命令作为参数传递,然后在 shell 中调用 "$@"。我更喜欢单引号。

docker run -ti --rm osgeo/gdal:ubuntu-small-latest \
    /bin/bash -c 'cd '"$(pwd)"' && "$@"' -- "$@"

如果你只想要cd,就让docker用-w改变目录。在 Bash 中,$PWD 会比 pwd 命令更快。

docker run ... -w "$PWD" image "$@"

请注意,"$(pwd)" 在子 shell 中没有正确引用 - 结果将进行分词和文件名扩展。无论如何,我推荐 declare -p 和 Bash 数组(以及 declare -f 用于函数)在 Bash-es 之间传输数据。 declare 将始终正确引用所有内容,以便子 shell 可以正确导入它。

cmd=("$@")
pwd=$PWD
work() {
   cd "$pwd"
   "${cmd[@]}"
}
docker ... bash -c "$(declare -p pwd cmd); $(declare -f work); work"

研究:shell中何时使用引号,单引号和双引号的区别,分词扩展以及如何防止,https://mywiki.wooledge.org/Quotes,bash数组,https://mywiki.wooledge.org/BashFAQ/050

【讨论】:

  • 它就像一个魅力。但我不明白这里的几件事。首先,如果'"$(pwd)"' 变为"$(pwd)",为什么它不起作用。我认为单引号内的所有内容都是按字面意思处理的,我的路径没有任何特殊字符(/home/john/Downloads)。其次,cd '"$(pwd)"' && "$@" 周围的单引号是否会使其按字面意思对待,而扩展 "$@" 不起作用?三、为什么会运行"$@"两次?第四,我认为双破折号-- 代表/bin/bash 选项列表的结尾。所以,最后一个"$@" 是执行我的命令的那个,对吧?谢谢。
  • why doesn't it work if '"$(pwd)"' becomes "$(pwd)" 研究单引号和双引号的区别。此外,它也不是很好,因为 $(pwd) 的结果会进行分词 - 它不适用于带有空格的路径。 would the single quotes around cd '"$(pwd)"' && "$@" make it treated literally $(pwd) 在双引号内,其余的是字面意思,是的。 the expansion "$@" not working? bash -c 扩展 "$@"why does it run "$@" twice? 第一个脚本将参数作为参数传递给bash -c,然后bash -c 使用参数来运行程序。
  • So, the last "$@" is the one that executes my command, right? -- "$@" 将参数作为参数 传递给子shell bash -c,然后'... "$@"'bash -c 子shell 中执行命令。有两个 shell - 您的脚本和子 bash -c 在容器内运行。 -- 实际上并不是选项的结尾,它是子 bash 内部的 $0,例如。 bash -c 'echo $0 $1' this_is_0 this_is_1,见man bash。有些人使用_,它只是一个占位符。
猜你喜欢
  • 2019-02-02
  • 2021-08-09
  • 2021-04-11
  • 2021-04-08
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多