我想知道是否有办法做到这一点
让我们假设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
答案 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
注意:这是我的文章,以了解ENTRYPOINT
中CMD
和Dockerfile
之间的区别:https://medium.freecodecamp.org/docker-entrypoint-cmd-dockerfile-best-practices-abc591c30e21