我在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,所以这可能是显而易见的,但现在我卡住了:/
2条答案
按热度按时间gopyfrb31#
zip文件中的二进制文件动态链接到平台上不可用的共享库。
使用
file
和ldd
可以确认这一点:在平台使用的Docker映像(
openwhisk/dockerskeleton
)内构建静态二进制文件或构建动态链接二进制文件。file not found
错误是误导性的,但在执行有此问题的文件时为reported by bash。gtlvzcf82#
"错误":"操作未返回字典。"
这是一个打开的wsk错误信息。这意味着您没有在stdout上返回字典
下面是一个有效的返回,因为它返回一个json对象
{" error ":"有东西坏了!"}
将无效
"什么东西坏了!"
建议:检查是否有任何错误,当你建立(通常)的文件在您的dropbox不看起来像一个二进制文件...我建议检查你可以建立二进制第一