docker - 链接命令时 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 。
这是什么原因?我该如何解决它?
解决方案
当您在 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
或类似的。
推荐阅读
- amazon-s3 - 通过亚马逊 s3 的电子自动更新不起作用
- reactjs - 如何从 React 自定义钩子和控制它的函数中正确导出组件?
- php - 在创建 Stripe 订阅计划时指定持续时间
- python - 短信被插入到两个不同的盒子里,而它应该只插入一个盒子里
- java - 为什么吃豆人游戏会自动暂停几秒钟然后又运行?
- docker - 气流:从 dockerOperator 连接到 docker 映像的问题:docker 案例中的 docker
- r - R:case_when 和过滤器组合导致未定义的列选择错误
- python - 遍历所有行
- delphi - 高 DPI Delphi 程序中的 Sisulizer 运行时变化
- python - tensor_scatter_nd_update ValueError: Shapes must be equal rank, but are 0 and 1