将带参数的命令作为字符串传递给docker run

时间:2016-09-12 05:36:12

标签: linux bash shell docker variable-expansion

我面临的问题是如何将带有参数的命令传递给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

1 个答案:

答案 0 :(得分:5)

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)"匹配的文件,因此它失败并不奇怪。它与#34没有任何关系; docker run并不理解替换"。这与shell在执行命令行之前解析命令行的方式有关。

当您移除$DOCKER_COMMAND周围的引号时,您最终会这样调用它(我将每个参数放在一个单独的行中以使其显而易见):

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

而且这不会起作用,因为bash将尝试运行脚本"(cd,这应该明确unexpected EOF while looking for matching"&#39的原因; error. Bash's - c`选项只接受一个参数,但由于shell扩展的工作方式,它获得了4。

你可以这样做:

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

(我已经删除了您的命令旁边的括号,因为他们没有按照您使用它们的方式做任何事情。)

这样,您就可以使用docker run命令调用bash,并且您只需给bash的-c选项一个参数( $DOCKER_COMMAND变量的内容。

相关问题