泊坞窗EXEC引用变量

时间:2019-01-30 22:11:42

标签: bash docker escaping dockerfile

我想知道是否有办法做到这一点

让我们假设dockerfile包含这条线,一个可执行的

的指定路径

ENV CLI /usr/local/bin/myprogram

我希望能够通过exec命令使用ENV变量名来调用此程序。

例如 docker exec -it <my container> 'echo something-${CLI} 期待中 something-/usr/local/bin/myprogram

但是返回:

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"${CLI} do something\": executable file not found in $PATH": unknown

2 个答案:

答案 0 :(得分:2)

好吧,我找到了一种方法,您所要做的就是用bash评估命令

docker exec -it <container id> bash -c 'echo something-${CLI}'

返回something-/usr/local/bin/myprogram

答案 1 :(得分:-2)

采用原始格式docker exec -it <my container> '${CLI} do something',期望将${CLI}替换为/usr/local/bin/myprogram(作为exec COMMAND),并以ARG的形式传递所有内容到/usr/local/bin/myprogram的地址无效,这已明确记录:https://docs.docker.com/engine/reference/commandline/exec/

  

COMMAND应该是可执行文件,链接的命令或带引号的命令将不起作用。示例:

     

docker exec -ti my_container "echo a && echo b"不起作用,但是

     

docker exec -ti my_container sh -c "echo a && echo b"

根据文档,这将按预期工作:docker exec -ti my_container sh -c "${CLI} foo"${CLI}将在变量扩展并将参数传递到${CLI}中设置的shell脚本后执行(例如sh -c /usr/local/bin/myprogram foo)。

或者,您可以将ENTRYPOINT设置为脚本,并使用CMD或在命令行使用docker run传递参数,例如:

给出以下目录结构:

.
├── Dockerfile
└── example.sh

Dockerfile的内容:

FROM ubuntu:18.04
COPY example.sh /bin
RUN chmod u+x /bin/example.sh
ENTRYPOINT ["/bin/example.sh"]
CMD ["bla"]

还有example.sh脚本内容:

#!/bin/bash
echo $1

CMD之后的Dockerfile中指定的ENTRYPOINT将是脚本的默认参数,您可以在命令行中覆盖默认参数(假设已构建图像并标记为example:0.1):

user@host> docker run --rm example:0.1
bla
user@host> docker run --rm example:0.1 "arbitrary text"
arbitrary text

注意:这是我的文章,以了解ENTRYPOINTCMDDockerfile之间的区别:https://medium.freecodecamp.org/docker-entrypoint-cmd-dockerfile-best-practices-abc591c30e21