将带参数的命令作为字符串传递给码头运行
我正面临的问题是如何将参数传递给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
?
开始与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 run
与bash
命令,并且您正在给bash的-c
选项提供一个参数($DOCKER_COMMAND
变量的内容)。
特别感谢你的解释,因为它可以帮助我理解这两种形式之间的区别。我已经采纳了将字符串传递给'bash -c',它很适合我的应用程序。 – meowsqueak
我认为你应该把你的问题降到最低限度。 (例如,为什么docker会涉及到这一点很重要。)对我来说,这听起来像:“我怎样才能使用环境变量来解析参数到我的脚本。“ –
@MichaWiedenmann感谢您的评论,其实更多的是关于Docker如何接受参数,以及如何从环境变量中提取这些参数,这通常不会出现,因为大多数命令都可以从引用的字符串构建,但是docker需要单独的参数。我会添加一些背景。 – meowsqueak
@MichaWiedenmann好的,我已经简化了它。 – meowsqueak