首页 文章

如何在OpenWhisk上使用redis包运行Go函数?

提问于
浏览
1

我在OpenWhisk(IBM Cloud Functions)上运行golang包时遇到了一些麻烦 .

我在我的本地计算机上运行以下命令,它没有任何问题( go run sample.go ):

package main


import (
    "fmt"
    "encoding/json"
    "github.com/go-redis/redis"
)


func main() {

    var redisClient *redis.Client = redis.NewClient(&redis.Options{
        Addr: "...",
        Password: "...",
        DB: 0,
    })

    redisClient.Set("foo", "bar", 0)

    defer redisClient.Close()

    msg := map[string]string{"msg": ("Done !")}
    res, _ := json.Marshal(msg)
    fmt.Println(string(res))

}

但我没有找到任何方法让它在OpenWhisk上运行 . 我运行了以下内容:

GOOS=linux GOARCH=amd64 go build -o exec sample.go

zip exec.zip exec

bx wsk action update myfunction --native exec.zip

bx wsk action invoke myfunction -r
bx wsk activation logs --last --strip

“错误”:“该操作未返回字典 . ” “2018-02-21T01:21:05.962244788Z stdout:[Errno 2]没有这样的文件或目录:'/ action / exec'”

问题与 github.com/go-redis/redis 包有关,当我删除它及其代码时,该函数运行良好 . 我遇到了 mgo 包(MongoDB)的同样问题......

我是Golang的新手,所以它可能是显而易见的,但是现在我被卡住了:/

2 回答

  • 3

    zip文件中的二进制文件动态链接到平台上不可用的共享库 .

    使用 fileldd 确认了这一点:

    $ file exec 
    exec: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped 
    $ ldd exec
    /lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
    libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
    libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f3f63f10000)
    

    构建静态二进制文件或在平台使用的Docker镜像内构建动态链接二进制文件( openwhisk/dockerskeleton ) .

    file not found 错误具有误导性,但在执行此问题的文件时reported by bash .

  • -1

    “错误”:“该操作未返回字典 . ”

    这是一个打开的wsk错误消息 . 这意味着你没有在stdout上返回字典

    下面是一个有效的返回值,因为它返回一个json对象

    {“错误”:“东西坏了!”}

    以下将无效

    “有什么东西坏了!”

    建议:检查你的构建时是否有任何错误(通常)你的dropbox中的文件看起来不像二进制文件...我建议检查你可以先构建二进制文件

相关问题