2016-05-17 297 views
11

我在我的項目中使用glog標誌log_dir。最近我進口kubernetes庫,並開始得到這個運行時的恐慌glog標誌重新定義錯誤

恐慌:./aaa.test標誌重新定義: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 

它看起來像這是由K8S vendored出入記錄庫與一個衝突的,我正在使用。引入供應商目錄解決這個問題的解決方案?我應該使用glide,govendor,gb等vendoring庫嗎?如果是,哪一個是首選?

回答

2

該錯誤不是與衝突庫有關,而是一個衝突標誌(log_dir)。這意味着您要添加一個「--log_dir」標誌,並且kubernetes使用的glog庫也有log_dir標誌。這是在包init期間在庫中添加標誌的問題。不幸的是,vendoring不會改變任何東西。您可以通過在導入日誌庫或kubernetes時通過操作flag.CommandLine全局變量指向不同的flag.FlagSet來解決此問題,但這樣做會很棘手,因爲它取決於導入順序。

1

當我使用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

1

我用K8S庫和麪臨flag redefined: log_dir的問題太多。 我發現幾個kubernetes包不在我的供應商那麼我govendor add他們,那麼它是固定的。

我猜想當我的供應商文件夾中找不到那些軟件包時,glog的兩個副本就建立了(一個在我的供應商文件夾中,一個在我的$ GOPATH中的k8s.io/kubernetes/vendor中)。

如何找出丟失的包?我使用愚蠢的方式,將$ GOPATH/src/k8s.io重命名爲其他內容並構建我的項目,查看未找到的內容。然後添加它〜