16

I am using glog flag log_dir in my project. Recently I imported kubernetes library and started getting this runtime panic

panic: ./aaa.test flag redefined: log_dir

May 16 23:51:35 ecmdev03-core01 docker[26867]: goroutine 1 [running]:
May 16 23:51:35 ecmdev03-core01 docker[26867]: panic(0x15ebc60, 0xc8201aae90)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/runtime/panic.go:464 +0x3e6
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).Var(0xc8200160c0, 0x7f561118c1c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:776 +0x454
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).StringVar(0xc8200160c0, 0xc8201aae40, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:679 +0xc7
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.(*FlagSet).String(0xc8200160c0, 0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xc8201aae30)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:692 +0x83
May 16 23:51:35 ecmdev03-core01 docker[26867]: flag.String(0x1bddd70, 0x7, 0x0, 0x0, 0x1d75860, 0x2f, 0xba3950)
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /usr/local/go/src/flag/flag.go:699 +0x5f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/vendor/github.com/golang/glog.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/vendor/github.com/golang/glog/glog_file.go:41 +0x13e
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/labels.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/labels/selector.go:810 +0x6b
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api/unversioned.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/unversioned/well_known_labels.go:30 +0x6f
May 16 23:51:35 ecmdev03-core01 docker[26867]: k8s.io/kubernetes/pkg/api.init()
May 16 23:51:35 ecmdev03-core01 docker[26867]:         /src/ecm_infra/go/src/k8s.io/kubernetes/pkg/api/types.go:2731 +0x64

It looks like glog library which is vendored by k8s is conflicting with the one that I am using. Is introducing vendor directory a solution for this problem? Should I use vendoring libraries like glide, govendor, gb etc? If yes, which one is preferred?

4

5 回答 5

5

该错误与冲突库无关,它是一个冲突标志 ( log_dir)。这意味着您正在添加一个“--log_dir”标志,并且 kubernetes 使用的 glog 库也有一个log_dir标志。这是在包初始化期间在库中添加标志的问题。不幸的是,供应商不会改变任何事情。您可以通过在导入日志库或 kubernetes 时操作flag.CommandLine全局变量以指向不同的变量来解决此flag.FlagSet问题,但这会很棘手,因为它取决于导入顺序。

于 2016-05-18T18:45:11.023 回答
3

在使用 glide 供应我的依赖项时,我遇到了类似的问题。

根据https://github.com/kubernetes/kubernetes/issues/25572 kubernetes 没有 glide.lock / glide.yml,依赖扁平化不会发生,最后 glog 被定义两次,因为 vendor/k8s.io/ kubernetes/vendor 也包括在内。

上述链接的解决方法对我很有用:

glide install --strip-vendor --strip-vcs

于 2016-06-21T19:02:13.093 回答
3

我使用 k8s 库也遇到flag redefined: log_dir了问题。我发现几个kubernetes包不在我的供应商中。然后我govendor add他们,然后它被修复了。

我猜当在我的供应商文件夹中找不到这些包时,构建了两个 glog 副本(一个在我的供应商文件夹中,一个在我的 $GOPATH 中的 k8s.io/kubernetes/vendor 中)。

如何找出丢失的包裹?我用笨办法,把$GOPATH/src/k8s.io改成别的名字,然后自己建项目,看看没找到什么的,再添加吧~

于 2016-09-21T15:43:13.377 回答
1

我看到flag redefined: log_dir错误并且堆栈跟踪指出glog/glog_file.go:41 +0xd3

问题的根本原因是GOPATH.

我在不同的位置有两个相同的 repo 副本。在尝试在其中一个副本中运行测试时,go 包是从另一个 repo 中挑选出来的。所以我对glog.

我将另一个 repo 重命名为新名称,然后它开始工作。

因此,请检查您的GOPATH并确保您没有从其他地方导入库。

于 2019-03-26T07:39:05.510 回答
0
if flag.CommandLine.Lookup("log_dir") != nil {
    flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}
klog.InitFlags(nil)  // add the block above before invoking klog.InitFlags()
于 2022-03-01T12:42:13.257 回答