对于kubecconfig,在Go中不能设置绝对路径



我正在用Go模块调用kubectl,如下所示:

getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", "~/.kube/<kube-config-file>", "get", "ns")

如果我像这样设置路径就可以了:

getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", "../../../../.kube/<kube-config-file>", "get", "ns")

我正在使用Go cmd包

当前这个模块位于另一个repo中,这就是为什么它必须向上导航四层。我认为这是因为命令是从这个文件的角度运行的,但它似乎不应该这样做。如果它是简单的运行它作为一个cli命令第一个(我认为)应该工作。

当我从cli手动运行这个命令时,它工作得很好:

$ kubectl --kubeconfig ~/.kube/<kube-config-file> get ns

使用~作为快捷方式是bash特有的。~只抓取用户的$HOME目录,但不能在shell的所有实现中工作。这是可以从终端使用的东西,但并不总是从代码中使用(它不是独立于shell的)。但是,go也可以使用os.UserHomeDir()找到当前用户的主目录。

https://pkg.go.dev/os UserHomeDir

像这样的东西应该可以工作

package main
import (
"fmt"
"os"
)
func main() {
homeDir, _ := os.UserHomeDir()
fmt.Printf("%s/.kube/<kube-config-file>", homeDir)
}

输出:/root/.kube/<kube-config-file>

由于您正在使用的包提到它包装了Go的os/exec包,这里是他们文档的摘录:

与"系统"不同从C和其他语言的库调用Os/exec包有意不调用系统shell和不展开任何全局模式或处理其他展开;管道或重定向通常由shell完成。这个包表现得更像C的"执行"。函数族。向全球扩张模式,或者直接调用shell,注意避免任何或者使用path/filepath包的Glob函数。来展开环境变量,使用操作系统的ExpandEnv.

所以我想你会想尝试这样做:

import "os"
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", os.ExpandEnv("$HOME/.kube/<kube-config-file>"), "get", "ns")

正如其他人提到的,我需要获取主目录环境变量。但是我是这样实现的:

homePath, _ := os.LookupEnv("HOME")
//
getNsCmd := cmd.NewCmd("kubectl", "--kubeconfig", homePath+"/.kube/<kube-config-file>", "get", "ns")

相关内容

  • 没有找到相关文章

最新更新