我总是收到以下错误: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 关注
- 358 浏览
添加回答
举报
0/150
提交
取消
