英文:
Calling "argocd login" fails with "Local config: current-context unset"
问题
我们的一个客户在运行我们的命令行二进制文件时遇到了一个奇怪的错误。我将错误缩小到了我们调用argocd login
时出现的问题,但不知何故,它失败并显示以下错误信息:
Local config: current-context unset
通过深入研究 argo-cd 源代码,我怀疑问题归结为使用 os.ReadFile
时传入了 ""
,但在客户的机器上却没有返回 ENOENT。我进行了以下简单检查:
package main
import (
"fmt"
"os"
)
func main() {
_, err := os.ReadFile("")
if err != nil {
fmt.Printf("err: %v\n", err)
if os.IsNotExist(err) {
fmt.Println("err is NotExist")
} else {
fmt.Println("err is *not* NotExist")
}
} else {
fmt.Println("no error at all")
}
}
在我测试的每个 Linux 发行版上,我得到的结果是 err is NotExist
。但我怀疑问题可能是由客户所运行的特定环境引起的。目前我所知道的是,他们通过 EC2 登录到某个内部的 Docker 容器,然后以 root 用户身份运行该命令。
这里是否有人能给我一些建议,告诉我可以查找什么,以及可能导致这个调用不返回 ENOENT 的原因?
英文:
one of our clients is encountering a strange bug when running our cli binary. i narrowed down the error to a call we are making for argocd login
, which for some reason fails with
Local config: current-context unset
from digging deeper into argo-cd source code, i suspect it all boils down to a call for os.ReadFile
with ""
, which does not return ENOENT on their machine. i have made this simple check:
package main
import (
"fmt"
"os"
)
func main() {
_, err := os.ReadFile("")
if err != nil {
fmt.Printf("err: %v\n", err)
if os.IsNotExist(err) {
fmt.Println("err is NotExist")
} else {
fmt.Println("err is *not* NotExist")
}
} else {
fmt.Println("no error at all")
}
}
on every linux distro i tested it on, i am getting err is NotExist
. but i suspect the issue might be caused by the specific env the customers are running in. all i know at the moment is that they shell into EC2, and then into some in-house docker container, and run the command as root user.
does anyone here have any tip on what i can look for, and what might cause this call to not return ENOENT?
答案1
得分: 1
os.ReadFile
直接将文件名传递给open(2)
系统调用。如果os.ReadFile("")
没有返回ENOENT
,那就意味着:
- 内核使用了非标准的文件系统实现(例如,通过Fuse自定义的文件系统),或者
- 通过系统调用钩子强制内核返回了不同的结果(例如,EBPF)。
英文:
os.ReadFile
passes the filename directly to the open(2) system call. If os.ReadFile("")
is not returning ENOENT
, that implies:
- a non-standard file system implementation from the kernel (eg, something custom via Fuse), or
- a syscall hook forcing a different result from the kernel (eg, EBPF)
答案2
得分: 0
在GCP Cloud Build中遇到了相同的问题,通过在ArgoCD步骤之前删除一些步骤来解决了。🧑💻
英文:
has same issue in gcp cloudbuild, fixed by removing some steps before argocd step 🧙🏼♂️
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论