【问题标题】:Permission denied error when running Go server as Docker container将 Go 服务器作为 Docker 容器运行时出现权限被拒绝错误
【发布时间】:2020-07-01 03:09:47
【问题描述】:

我想将我的 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.

感谢您的帮助。

【问题讨论】:

  • 您在服务器内部使用哪个端口?如果是特权端口(bind。
  • 为什么你的 Dockerfile 中没有 EXPOSE <PORT> 行? Google Cloud Run 不需要这个吗?
  • 端口定义为 .env 文件。我也想知道缺少的“EXPOSE”命令,但他们的示例中也缺少它。
  • 您的主机操作系统是什么?我从您发布的链接中尝试了 helloworld 应用程序,并且在本地没有问题。我在 Fedora 31 上。
  • 启动容器时出现问题。建筑图像应该是相同的。似乎权限有问题。复制文件后尝试移动RUN chmod a+x server 行(但不要忘记/)。

标签: docker go google-cloud-platform google-cloud-run


【解决方案1】:

潜在问题 1

如果将 alpine 更改为 debian 对您有用,则意味着这是交叉编译的问题。

golang 图像基于 debian,使用 glibc,alpine 图像使用 musl libc。有时它们存在不兼容性,并且会在最坏的错误消息中暴露自己。

所以我怀疑这不是 Cloud Run 问题,而是之前的问题。为了验证,您还可以在本地运行您的容器,就像它在 Cloud Run 上运行一样https://cloud.google.com/run/docs/testing/local


潜在问题 2

类似的事情曾经发生在我身上,结果我正在构建的包不是package main。因此,我没有生成可执行的二进制文件,而是生成了一个目标文件 (.o),当然,无论我多么努力地“chmod +x”,它都不会启动。

验证您正在构建的 go 包路径实际上是 package main

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-23
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多