我在设置 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
$PATH
Environment=
EnvironmentFile=
PassEnvironment=
ExecSearchPath=
您可以使用嵌入式配置文件,而不必修改单元文件,例如:/etc/systemd/system/foo.service.d/bar.conf
。