链式命令时Docker run使用主机PATH

时间:2019-11-05 11:08:24

标签: docker

我写了一个映像,其中捆绑了utils以使用多个CLI运行命令。我想将其作为可执行文件运行,如下所示:

docker run my_image cli command

其中CLI是我的自定义CLI,而command是该CLI的命令。

构建映像时,我在Dockerfile中有以下说明:

ENV PATH="/cli/scripts:${PATH}"

如果我不将命令链接到容器,则上述方法有效。如果我链接命令,它将停止工作:

docker run my_image cli command && cli anothercommand

Command 'cli' not found, but can be installed with...

第一个命令起作用的地方,另一个命令失败的地方。

因此,逻辑结论是路径中缺少cli。我试图用以下方法验证这一点:

docker run my_image printenv PATH

这实际上输出了容器PATH,一切看起来都很好。所以我也尝试链接此命令:

docker run my_image printenv PATH && printenv PATH 确实,这首先输出容器PATH,然后输出我系统的PATH。

这是什么原因?我该如何解决?

1 个答案:

答案 0 :(得分:1)

在外壳程序中键入命令时,本地外壳程序将在运行任何命令之前首先对其进行处理。看到(重新格式化)

docker run my_image cli command \
  && \
cli anothercommand

也就是说,您的主机的外壳会拾取&&,因此主机首先运行docker run,然后运行cli anothercommand(如果容器成功退出)。

您可以告诉容器运行一个Shell,然后容器Shell将处理诸如命令链,重定向和环境变量之类的事情

docker run my_image sh -c 'cli command && cli anothercommand'

如果这不是偶然使用的话,还可以考虑将其写入Shell脚本

#!/bin/sh
set -e
cli command
cli another command

COPY将该脚本放入您的Docker映像中,然后您可以docker run my_image cli_commands.sh或类似的东西。