我在设置 Ubuntu Server 18.10 时通过 snap 安装了 Docker。
如果我有一个引用该docker命令的 systemd 单元文件,则会收到此错误:
Executable "docker" not found in path "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Run Code Online (Sandbox Code Playgroud)
我不确定它从哪里获得此搜索路径。它与 /etc/environment 中的内容不匹配。
在不修改单元文件的情况下,我可以全局更改 systemd 使用的搜索路径以包含/snap/bin吗?
在 Ubuntu 18.04 系统上,仅在docker没有完整路径的情况下使用会导致错误Executable path is not absolute. 理想情况下,我希望相同的服务文件与 snap 的 Docker 和 apt 的 docker-ce 包一起使用。
根据systemd 文档,它的 PATH 是在编译时设置的(请参阅“命令行”部分):
如果命令不是完整(绝对)路径,则将使用在编译时确定的固定搜索路径将其解析为完整路径。在使用拆分 /usr/bin/ 和 /bin/ 目录的系统上,搜索的目录包括 /usr/local/bin/、/usr/bin/、/bin/,以及在使用拆分 bin/ 和 sbin/ 的系统上的 sbin/ 对应目录。因此,如果可执行文件位于任何“标准”目录中,则仅使用可执行文件名称是安全的,而在其他情况下必须使用绝对路径。建议使用绝对路径以避免歧义。提示:可以使用 systemd-path search-binaries-default 查询此搜索路径。
在我的 Ubuntu 18.04 上查询路径的命令是sudo systemd-path search-binaries(在 Arch 上,它是systemd-path search-binaries-default):
$ sudo systemd-path search-binaries
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)
因此,您有以下选择:
好处:编辑单元文件,使其使用绝对路径。假设您可以访问它,这是迄今为止最好的解决方案。它使文件符合规范,允许您将其复制到其他机器,甚至使警告消息静音。
坏处:systemd从源代码重新编译,并更改路径。除非您真的知道自己在做什么,否则这既费时又复杂,而且是个坏主意。即使你这样做了,这似乎也是一个糟糕的解决方案。systemd每次设置新机器时,您都无法重新编译。
丑陋的:如果你真的不能修复单元文件,你总是可以创建一个/usr/bin指向的符号链接docker
sudo ln -s /snap/bin/docker /usr/bin/docker
Run Code Online (Sandbox Code Playgroud)
这是解决这个问题的方法。
要检查变量 PATH 的值:
echo $PATH
Run Code Online (Sandbox Code Playgroud)
添加 /snap/bin
export PATH="$PATH:/snap/bin"
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,则有一个名为 /etc/environment 的文件
| 归档时间: |
|
| 查看次数: |
29258 次 |
| 最近记录: |