【问题标题】:How to load local assets within a GCP cloud function?如何在 GCP 云功能中加载本地资产?
【发布时间】:2019-06-15 00:58:29
【问题描述】:

我正在 Golang 中构建一个微型 GCP 云函数,当通过 HTTP 调用它时,它会返回一个生成的 PNG 文件。我通过 Google Cloud Console 中的 ZIP-Upload 部署了我的代码。 目前它被正确调用并且代码被编译等等。但是在我的代码中我必须加载几个本地文件 - 一个字体和一个 .png 图像。 我在上传的 ZIP 中捆绑了这些文件,这些文件在 GCP 的源视图中可见。所有文件(图像、字体和 go-files)都在同一个目录中。

调用云函数时,日志会显示以下内容:

2019/01/21 14:59:31 open /english.png: no such file or directory

我试图改变构建文件路径的方式。我已经静态使用了 /german.png,尝试了几次动态构建路径。

我不能 100% 确定这是否可行,但这是我第一次尝试“无服务器”,我愿意以“正确”的方式完成它。

import "github.com/fogleman/gg"


func main() {
    ex, err := os.Executable()
    if err != nil {
        panic(err)
    }
    executableDir := filepath.Dir(ex)

    img, err :=gg.LoadPNG(path.Join(executableDir, "./english.png"))
    if err != nil {
        log.Fatal(err)
    }
}

目前在我所做的任何尝试中都找不到该文件。也许图像“部署”到的路径与我尝试的路径不同 - 我在文档中没有找到任何关于它的注释。 我显然希望它能够正确加载。

【问题讨论】:

    标签: go google-cloud-platform google-cloud-functions


    【解决方案1】:

    根据documentation的Go 1.13,截至今天(2020年7月),源代码位于./serverless_function_source_code目录下。

    buildpack 是一个很好的参考。

    【讨论】:

      【解决方案2】:

      我创建了具有以下结构的 http 函数:

      api
      |--test.txt
      |--api.go
      

      并编写了简单的函数来回复文件内容:

      package api
      
      import (
          "io/ioutil"
          "net/http"
      )
      
      // FileTest func
      func FileTest(w http.ResponseWriter, r *http.Request) {
          content, err := ioutil.ReadFile("./test.txt")
          if err != nil {
              w.WriteHeader(http.StatusInternalServerError)
              w.Write([]byte(err.Error()))
              return
          }
      
          w.Write(content)
      }
      

      它返回文件内容没有任何问题。 https://us-central1-clickshield24m.cloudfunctions.net/api

      所以在你的情况下,我会尝试将路径更改为gg.LoadPNG("./english.png")

      【讨论】:

      • 嗯。我已经尝试过这种方法(作为第一种方法),但它不起作用。奇怪的。会再试一次,谢谢!
      • 一些附加信息供下一个查找它的人使用:看起来 GCF Go 1.11 运行时函数二进制路径是 /start 并且资产/文件位于目录 /srv/files 中,这也是当前工作目录(因此相对路径应该如this answer中所指出的那样工作)。使用可执行文件路径定位资产是错误的,因为可执行文件位于文件系统根目录中。
      • 使用 go 1.13 我得到“没有这样的文件或目录”。
      • @maclir 与 go 1.13 我唯一的方法是从根目录开始,例如:./src/my_function/assets/my_asset.html
      【解决方案3】:

      ./serverless_function_source_code 对我使用 go113 运行时和供应商不起作用。我想在供应商目录中找到一个文件。

      我的文件结构是:

      myfn
      |- main.go
      |- go.mod
      |- .gcloudignore
      

      我的部署步骤是:

      cd myfn
      go mod vendor
      gcloud functions deploy MyFunction --runtime go113 --set-env-vars "PATH_FILES=./src/myfn/vendor/static"
      

      我通过部署一个函数发现了这一点,该函数列出了以"." 开头的特定深度的所有文件并且没有看到serverless_function_source_code 目录。但是有src/myfn。

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2018-08-15
        • 2020-10-12
        相关资源
        最近更新 更多