我写了一个映像,其中捆绑了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。
这是什么原因?我该如何解决?
答案 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
或类似的东西。