代码之家  ›  专栏  ›  技术社区  ›  Cinn smfoote

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

  •  1
  • Cinn smfoote  · 技术社区  · 7 年前

    我在OpenWhisk(IBM云功能)上运行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
    

    “error”:“该操作未返回字典。”

    “2018-02-21T01:21:05.962244788Z标准输出:[错误2]没有此类文件或 目录:“%action/exec”

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

    我是刚来戈兰的新人,所以这可能很明显,但现在我被困在了:/

    2 回复  |  直到 7 年前
        1
  •  3
  •   James Thomas    7 年前

    zip文件中的二进制文件是根据平台上不可用的共享库动态链接的。

    使用 file ldd 确认这一点:

    $ 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 执行具有此问题的文件时。

        2
  •  -1
  •   joe    7 年前

    “error”:“该操作未返回字典。”

    这是一条打开的wsk错误消息。 这意味着您没有在标准输出上返回词典

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

    {“error”:“有东西坏了!”}

    以下内容无效

    “有东西坏了!”

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

    推荐文章