dav*_*idA 7 linux bash shell variable-expansion docker
我面临的问题是如何传递带参数的命令docker run.问题是docker run不将命令加参数作为单个字符串.它们需要作为单独的一等参数提供docker run,例如:
#!/bin/bash
docker run --rm -it myImage bash -c "(cd build && make)"
Run Code Online (Sandbox Code Playgroud)
但是请将命令和参数视为变量的值:
#!/bin/bash -x
DOCKER_COMMAND='bash -c "(cd build && make)"'
docker run --rm -it myImage "$DOCKER_COMMAND"
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,因为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.
Run Code Online (Sandbox Code Playgroud)
略有变化,删除引用DOCKER_COMMAND:
#!/bin/bash -x
DOCKER_COMMAND='bash -c "(cd build && make)"'
docker run --rm -it myImage $DOCKER_COMMAND
Run Code Online (Sandbox Code Playgroud)
结果是:
+ 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
Run Code Online (Sandbox Code Playgroud)
如何从变量中扩展字符串,以便将其作为一个独特的命令和参数传递到docker run脚本中?
从docker run命令的语法开始,即:
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
Run Code Online (Sandbox Code Playgroud)
这意味着如果您运行:
DOCKER_COMMAND='bash -c "(cd build && make)"'
docker run --rm -it myImage "$DOCKER_COMMAND"
Run Code Online (Sandbox Code Playgroud)
您将整个$DOCKER_COMMAND变量作为传递COMMAND.您要求Docker找到与该名称匹配的文件bash -c "(cd build && make)",因此它失败并不奇怪.它与"docker run不理解替换"没有任何关系.这与shell在执行命令行之前解析命令行的方式有关.
当你删除引号时$DOCKER_COMMAND,你最终会这样调用它(我将每个参数放在一个单独的行上以使其显而易见):
docker
run
--rm
-it
myImage
bash
-c
"(cd
build
&&
make)"
Run Code Online (Sandbox Code Playgroud)
而且这不会起作用,因为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"
Run Code Online (Sandbox Code Playgroud)
(我已经删除了命令周围的括号,因为它们没有像你使用它们那样做任何事情.)
这样,你docker run用一个命令调用bash,并且你给bash的-c选项一个参数($DOCKER_COMMAND变量的内容).
| 归档时间: |
|
| 查看次数: |
6780 次 |
| 最近记录: |