我想将我的Go服务器部署到Google Cloud Run。我从this指南中复制了Dockerfile。
FROM golang:1.13 as builder
WORKDIR /app
COPY go.* ./
RUN go mod download
COPY . ./
RUN CGO_ENABLED=0 GOOS=linux go build -v -o server
RUN chmod a+x server
FROM alpine:3
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/server /server
CMD ["/server"]
在将其部署到Cloud Run之前,我希望通过使用docker build -t server .
构建映像并使用docker run server
运行容器来在本地对其进行测试。
它失败,并出现以下错误:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"/server\": permission denied": unknown.
谢谢你的帮助。
3条答案
按热度按时间pw136qt21#
潜在问题1
如果将
alpine
更改为debian
对您有效,则意味着这是交叉编译的问题。golang
映像是基于debian的,使用glibc,alpine
映像使用musl libc。有时这些映像有不兼容性,并在最糟糕的错误信息中暴露自己。所以我怀疑这不是Cloud Run的问题,而是之前的问题。
潜在问题2
类似的事情曾经发生在我身上,结果发现我正在构建的包不是
package main
。所以我没有生成一个可执行的二进制文件,而是生成了一个目标文件(.o),当然,无论我多么努力地“chmod +x”,都不会启动。验证您正在构建的go包路径实际上是
package main
。gcuhipw92#
尝试将
RUN chmod a+x
添加到最终构建。yxyvkwin3#
我得到的权限被拒绝的错误,以及使用后,这个Firebase教程提供的Dockerfile为GoLang的云运行。
显然,这可能是因为alpine linux被如此精简,以至于它缺少了容器正确构建或运行所需的关键包。
对于我的情况,它缺少
git
。我将git
添加到RUN行,就在ca-certificates之后,以确保它已安装。在此更改之后,我的Cloud Run示例工作正常。更多细节请参见Docker Library GoLang Github上的评论。