我面临的问题是如何将带有参数的命令传递给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 :(得分: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
变量的内容。