将带参数的命令作为字符串传递给码头运行

问题描述:

我正面临的问题是如何将参数传递给docker run。问题是docker run不会将命令加参数作为单个字符串。他们需要为个人一流的参数docker run,如要提供:将带参数的命令作为字符串传递给码头运行

#!/bin/bash 
docker run --rm -it myImage bash -c "(cd build && make)" 

但是考虑命令和参数作为一个变量的值:

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

不幸的是,这并不工作因为docker run不理解替代:

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
docker: Error response from daemon: oci runtime error: exec: "bash -c \"(cd build && make)\"": stat bash -c "(cd build && make)": no such file or directory. 

略有变化,去除DOCKER_COMMAND报价:

#!/bin/bash -x 
DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage $DOCKER_COMMAND 

结果:

+ docker run --rm -it myImage 'bash -c "(cd build && make)"' 
build: -c: line 0: unexpected EOF while looking for matching `"' 
build: -c: line 1: syntax error: unexpected end of file 

我怎样才能扩大从变量的字符串,使其作为脚本中一个独特的命令和参数来传递docker run

+0

我认为你应该把你的问题降到最低限度。 (例如,为什么docker会涉及到这一点很重要。)对我来说,这听起来像:“我怎样才能使用环境变量来解析参数到我的脚本。“ –

+0

@MichaWiedenmann感谢您的评论,其实更多的是关于Docker如何接受参数,以及如何从环境变量中提取这些参数,这通常不会出现,因为大多数命令都可以从引用的字符串构建,但是docker需要单独的参数。我会添加一些背景。 – meowsqueak

+0

@MichaWiedenmann好的,我已经简化了它。 – meowsqueak

开始与docker run命令的语法,这就是:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] 

这意味着如果你运行:

DOCKER_COMMAND='bash -c "(cd build && make)"' 
docker run --rm -it myImage "$DOCKER_COMMAND" 

您传递$DOCKER_COMMAND变量的全部为COMMAND。你要求Docker找到一个匹配名称bash -c "(cd build && make)"的文件,所以它不应该感到惊讶。它没有任何关系,“码头运行不理解替换”。这与你的shell在执行它们之前解析命令行的方式有关。

当您删除周围$DOCKER_COMMAND引号,你最终会调用它像这样(我把每个参数在单独一行,使其明显):

docker 
run 
--rm 
-it 
myImage 
bash 
-c 
"(cd 
build 
&& 
make)" 

,这就是行不通的,因为bash的是要尝试运行脚本"(cd,这将使明显的unexpected EOF while looking for matching“原因” error. Bash's -c`选项只接受一个参数,但由于方式shell扩展的作品,它变得4.

你可以这样做:

DOCKER_COMMAND='cd build && make' 
docker run --rm -it myImage bash -c "$DOCKER_COMMAND" 

(我已经去除了周围的命令括号,因为他们没有做任何事情,你用他们的方式。)

这样,你打电话docker runbash命令,并且您正在给bash的-c选项提供一个参数($DOCKER_COMMAND变量的内容)。

+0

特别感谢你的解释,因为它可以帮助我理解这两种形式之间的区别。我已经采纳了将字符串传递给'bash -c',它很适合我的应用程序。 – meowsqueak