如何在OpenWhisk上运行带有redis包的Go函数?

11dmarpk  于 2023-01-15  发布在  Go
关注(0)|答案(2)|浏览(97)

我在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

"错误":"操作未返回字典。"
"2018年2月21日T01:21:05.962244788Z标准输出:[Errno 2]没有这样的文件或目录:"/操作/执行""
这个问题与github.com/go-redis/redis包有关,当我删除它和它的代码时,函数运行良好。我在mgo包(MongoDB)中遇到了同样的问题。
我刚到Golang,所以这可能是显而易见的,但现在我卡住了:/

gopyfrb3

gopyfrb31#

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

gtlvzcf8

gtlvzcf82#

"错误":"操作未返回字典。"
这是一个打开的wsk错误信息。这意味着您没有在stdout上返回字典
下面是一个有效的返回,因为它返回一个json对象
{" error ":"有东西坏了!"}
将无效
"什么东西坏了!"
建议:检查是否有任何错误,当你建立(通常)的文件在您的dropbox不看起来像一个二进制文件...我建议检查你可以建立二进制第一

相关问题