我總是收到以下錯誤:plugin.Open("./plugin"): plugin was built with a different version of package internal/cpu我對這個問題做了一些研究,它清楚地指出,插件是使用不同的上下文版本(golang版本或依賴項)構建的,而不是加載插件的應用程序。我在 Docker 下進行了最小的測試,使用完全相同的 Go 編譯器版本和相同的映像來構建插件和應用程序,但我仍然收到相同的錯誤。如果有人能指出失敗的地方,或者我應該檢查什么來防止此錯誤,我將不勝感激。值得一提的是,我正在使用MacOS,但我正在Docker容器下運行測試。實際上,我能夠在Docker下為第三方產品構建和運行golang插件。代碼如下:// main.gopackage mainimport ( "fmt" "plugin")func main() { path := "./plugin.so" p, err := plugin.Open(path) if err != nil { fmt.Printf("unable to load plugin at %s.\n%v", path, err) } symbol, err := p.Lookup("Create") if err != nil { fmt.Printf("unable to find Create() function in plugin %s.\n%v", path, err) } createMethod, ok := symbol.(func()interface{}) if !ok { fmt.Printf("Create is not a function in plugin %s", path) } createMethod()}// plugin.gopackage mainfunc Create() interface{} { return nil}//DockerfileFROM golang:1.13.5 as pluginBuilderWORKDIR /appCOPY . .RUN go build --buildmode=plugin --trimpath -o /plugin.so plugin.goFROM golang:1.13.5 as serverBuilderWORKDIR /appCOPY . .RUN go build -o /server main.goFROM debian:stable AS serverWORKDIR /appCOPY --from=pluginBuilder /plugin.so .COPY --from=serverBuilder /server .RUN /app/server謝謝
1 回答
一只甜甜圈
TA貢獻1836條經驗 獲得超5個贊
您在構建插件時使用該選項,但在構建應用程序時未使用該選項。編輯 docker 文件,以便兩個構建都使用(或兩者都不使用),然后應用程序將運行(好吧,它在我的機器上確實如此)。-trimpath-trimpath
我對為什么這會導致問題的猜測是“從編譯的可執行文件中刪除所有文件系統路徑”,因此當運行時驗證版本時,它會拾取路徑中的差異。trimpath
以下是對我有用的dockerfile(復制了原始文件的問題;唯一的更改是添加到第二個):-trimpathgo build
FROM golang:1.13.5 as pluginBuilder
WORKDIR /app
COPY . .
RUN go build --buildmode=plugin --trimpath -o /plugin.so plugin.go
FROM golang:1.13.5 as serverBuilder
WORKDIR /app
COPY . .
RUN go build --trimpath -o /server main.go
FROM debian:stable AS server
WORKDIR /app
COPY --from=pluginBuilder /plugin.so .
COPY --from=serverBuilder /server .
RUN /app/server
- 1 回答
- 0 關注
- 304 瀏覽
添加回答
舉報
0/150
提交
取消
