ImageMagick Go API HTTP挂在ReadImageBlob上

我写了一个Beego HTTP服务器,当用户点击一个端点时:

  • 服务器请求来自另一台服务器的图像(例如imgur)
  • 它读取图像的字节并将它们传递给gographics / imagick
  • 这(应该)调整图像大小,并返回结果的字节数组

实际上发生的事情是我的HTTP服务器完全挂起,我甚至没有去处理错误,并且在服务器的所有端点上都得到一个502坏的网关。

我的代码如下所示:

func processContactImage(idx int, image []byte) ([]byte, error) { imagick.Initialize() defer imagick.Terminate() log.Println("idx: ", idx) mw := imagick.NewMagickWand() log.Println("reading image blob: ", image) err := mw.ReadImageBlob(image) if err != nil { log.Println("reading blob failed: ", err) return []byte{}, err } //... } 

我可以在terminal上看到日志消息“reading image blob:[bytes,bytes bytes]”,并且我已经将打印的字节复制到另一个小程序中,以testing字节确实是否拥有图像。 它完全挂在err := mw.ReadImageBlob(image) ,我不认为它甚至进入了if err != nil因为我从来没有看到这个日志消息。

我应该如何debugging这个技巧是值得欢迎的。 我写了一个小程序来testing独立环境中的字节数组上的图像魔术function,并且一切正常。

我的想法:

  • 我并不完全理解Go如何处理堆栈/堆,我认为如果有必要的话,它可以把东西移到堆上,我不需要pipe理它。 不过,我在内存中存储的图像,我想也许seg fault但林不知道为什么它不会崩溃,但挂起…
  • ReadImageBlob期待的是一种图像数据,但它没有得到它,虽然我会认为它已经到了错误

编辑:

好的,感谢您的意见,经过更多的研究,似乎它与我在Docker中运行这个事实有关,但是并没有发生这个问题:

  1. 我已经将imagemagick的初始化移动到main,并且错误仍然发生
  2. 当我没有docker运行应用程序,并且我传递一个字节数组到处理程序,imagemagick代码运行良好。
  3. 当我附加到docker集装箱,添加一个小的testing程序,使用imagemagick(但不是一个Web服务,只是一个二进制)添加一个图像的圆圈,虽然非常缓慢

我的dockerfile看起来像这样:

 FROM golang:1.7-alpine RUN apk update && apk add git && apk add g++ && apk add bzr && \ rm -rf /var/cache/apk/* # ENV GOPATH /go # Install beego & bee RUN go get github.com/astaxie/beego RUN go get github.com/beego/bee RUN go get github.com/tools/godep RUN apk add --update alpine-sdk RUN apk add imagemagick-dev RUN go get gopkg.in/gographics/imagick.v2/imagick 

我想知道我是否错过了一个图书馆或者其他什么东西,它挂在C api上,Go正在等待回应。 有没有什么办法可以debugging呢?

好的…事实certificate这个问题是另一回事……也许是同时发生多个请求或者什么东西……我不确定,但是我已经创build了这个使用imagemagick在Go中的处理器它在我的docker集装箱内本地工作没有问题。 神秘继续….

不要在你的处理程序中这样做:

 imagick.Initialize() defer imagick.Terminate() 

这只是应该做一次,在你的main()

最有可能的是你与不同的请求发生冲突,每次请求结束时将整个ImageMagick拆除。

不错的@jdi和阿尔派有什么关系

下面是我的两个docker文件,第一个是Alpine @ 612MB不起作用,当imagemagick试图读取blob时,它会挂起。 第二个与golang:最新和931MB的作品。 我不知道为什么,但它确实解决了我的问题。

谢谢,我希望这可以帮助别人!

 FROM golang:1.7-alpine RUN apk update && apk add git && apk add g++ && apk add bzr && \ rm -rf /var/cache/apk/* RUN go get github.com/astaxie/beego RUN go get github.com/beego/bee RUN go get github.com/tools/godep RUN apk add --update alpine-sdk RUN apk add imagemagick-dev RUN go get gopkg.in/gographics/imagick.v2/imagick 

第二个:

 FROM golang:latest RUN apt-get update && \ apt-get install -qy \ pkg-config \ libmagickcore-dev \ libmagickwand-dev \ imagemagick \ git \ g++ \ bzr \ #clear up && apt-get autoremove && \ apt-get autoclean && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* RUN go get gopkg.in/gographics/imagick.v2/imagick RUN go get github.com/astaxie/beego RUN go get github.com/beego/bee RUN go get github.com/tools/godep