无法打开Go插件

  • 本文关键字:Go 插件 docker go
  • 更新时间 :
  • 英文 :


我总是得到以下错误:

plugin.Open("./plugin"): plugin was built with a different version of package internal/cpu

我对这个问题做了一些研究,它清楚地指出,与加载插件的应用程序相比,插件是使用不同的上下文版本(golang版本或依赖项)构建的。

我在Docker下运行了一个最小的测试,使用完全相同的Go编译器版本和相同的映像来构建插件和应用程序,但我仍然收到相同的错误。

如果有人能告诉我故障在哪里,或者我还应该检查什么来防止这个错误,我将不胜感激。

值得一提的是,我使用的是MacOS,但我在Docker容器下运行测试。事实上,我能够在Docker下为第三方产品构建和运行golang插件

这是代码:

// main.go
package main
import (
"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.go
package main
func Create() interface{} {
return nil
}
//Dockerfile
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 -o /server main.go
FROM debian:stable AS server
WORKDIR /app
COPY --from=pluginBuilder /plugin.so .
COPY --from=serverBuilder /server .
RUN /app/server

感谢

在构建插件时使用-trimpath选项,但在构建应用程序时不使用。编辑docker文件,使两个构建都使用-trimpath(或者两者都不使用),然后应用程序就会运行(在我的机器上运行得很好)。

关于为什么这会引起问题,我的猜测是CCD_;从已编译的可执行文件"中删除所有文件系统路径;因此,当运行时验证版本时,它会发现路径中的差异。

以下是适用于我的dockerfile(已经用原始文件复制了问题;唯一的更改是将-trimpath添加到第二个go 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

最新更新