首页 > 解决方案 > 链接命令时 Docker 运行使用主机 PATH

问题描述

我编写了一个图像,它捆绑了 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 。

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

标签: docker

解决方案


当您在 shell 中键入命令时,本地 shell 在运行任何命令之前首先对其进行处理。它看到(重新格式化)

docker run my_image cli command \
  && \
cli anothercommand

也就是说,你的主机的 shell 选择了&&,所以主机先运行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或类似的。


推荐阅读