将 /snap/bin 添加到 systemd 使用的 PATH

将 /snap/bin 添加到 systemd 使用的 PATH

我在设置 Ubuntu Server 18.10 时通过 snap 安装了 Docker。

如果我有一个引用该命令的 systemd 单元文件docker,我会收到此错误:

Executable "docker" not found in path "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

我不确定这个搜索路径是从哪里来的。它与 /etc/environment 中找到的内容不匹配。

没有修改单元文件,我可以全局更改 systemd 使用的搜索路径以包含/snap/bin吗?


在 Ubuntu 18.04 系统上,仅使用docker而不使用完整路径会导致错误Executable path is not absolute。我理想情况下希望同一个服务文件能够与 snap 的 Docker 和 apt 的 docker-ce 包一起使用。

答案1

根据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

因此,您有以下选择:

优点:编辑单元文件,使其使用绝对路径。假设您可以访问它,这是迄今为止最好的解决方案。它使文件符合规范,允许您将其复制到其他机器,甚至使警告消息静音。

缺点systemd从源代码重新编译,然后更改路径。这很耗时、很复杂,而且除非您真的知道自己在做什么,否则这是一个很糟糕的主意。即使您知道,这似乎也是一个糟糕的解决方案。您无法在systemd每次设置新机器时重新编译。

丑陋:如果你真的无法修复单元文件,你可以随时创建一个/usr/bin指向的符号链接docker

sudo ln -s /snap/bin/docker /usr/bin/docker

答案2

这是修复此问题的方法。

检查变量 PATH 的值:

echo $PATH

添加 /snap/bin

export PATH="$PATH:/snap/bin"

如果这不起作用,有一个名为 /etc/environment 的文件

答案3

从 systemd 版本 250 开始,您可以使用以下ExecSearchPath=选项:

ExecSearchPath=

采用以冒号分隔的绝对路径列表,相对于该列表可以找到 Exec*=(例如ExecStart=、等)属性所使用的可执行文件。如果用户未通过、或提供,则将覆盖。分配一个空字符串将删除先前的分配,并且多次设置为一个值将附加到先前的设置。ExecStop=ExecSearchPath=$PATH$PATHEnvironment=EnvironmentFile=PassEnvironment=ExecSearchPath=

您可以使用嵌入式配置文件,而不必修改单元文件,例如:/etc/systemd/system/foo.service.d/bar.conf

相关内容