我在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 回答
zip文件中的二进制文件动态链接到平台上不可用的共享库 .
使用
file
和ldd
确认了这一点:构建静态二进制文件或在平台使用的Docker镜像内构建动态链接二进制文件(
openwhisk/dockerskeleton
) .file not found
错误具有误导性,但在执行此问题的文件时reported by bash .这是一个打开的wsk错误消息 . 这意味着你没有在stdout上返回字典
下面是一个有效的返回值,因为它返回一个json对象
以下将无效
建议:检查你的构建时是否有任何错误(通常)你的dropbox中的文件看起来不像二进制文件...我建议检查你可以先构建二进制文件