为了账号安全,请及时绑定邮箱和手机立即绑定

将 Go 服务器作为 Docker 容器运行时出现权限被拒绝错误

将 Go 服务器作为 Docker 容器运行时出现权限被拒绝错误

Go
汪汪一只猫 2023-08-21 14:35:34
我想将我的 Go 服务器部署到 Google Cloud Run。我从本指南复制了 Dockerfile 。FROM golang:1.13 as builderWORKDIR /appCOPY go.* ./RUN go mod downloadCOPY . ./RUN CGO_ENABLED=0 GOOS=linux go build -v -o serverRUN chmod a+x serverFROM alpine:3RUN apk add --no-cache ca-certificatesCOPY --from=builder /app/server /serverCMD ["/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 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

潜在问题1

如果更改alpinedebian适合您,则意味着这是交叉编译的问题。

golang映像基于 debian,并使用 glibc,alpine映像使用 musl libc。有时,它们不兼容,并会出现最糟糕的错误消息。

所以我怀疑这不是 Cloud Run 问题,而是之前的问题。


潜在问题2

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

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


查看完整回答
反对 回复 2023-08-21
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

尝试添加RUN chmod a+x 到最终版本。

COPY --from=builder /app/server /server
RUN chmod a+x /server
CMD ["/server"]


查看完整回答
反对 回复 2023-08-21
?
holdtom

TA贡献1805条经验 获得超10个赞

显然,这可能是因为 alpine linux 过于精简,以至于缺少容器正常构建或运行所需的关键软件包。

对于我的情况,它丢失了git。我git在 ca-certificates 之后添加到 RUN 行,以确保它已安装。进行此更改后,我的 Cloud Run 实例可以正常运行。

# Use the official Golang image to create a build artifact.

# This is based on Debian and sets the GOPATH to /go.

FROM golang:1.19 as builder


# Create and change to the app directory.

WORKDIR /app


# Retrieve application dependencies using go modules.

# Allows container builds to reuse downloaded dependencies.

COPY go.* ./

RUN go mod download


# Copy local code to the container image.

COPY . ./


# Build the binary.

# -mod=readonly ensures immutable go.mod and go.sum in container builds.

RUN CGO_ENABLED=0 GOOS=linux go build -mod=readonly -v -o server


# Use the official Alpine image for a lean production container.

# https://hub.docker.com/_/alpine

# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds

FROM alpine:3

RUN apk add --no-cache ca-certificates git


# Copy the binary to the production image from the builder stage.

COPY --from=builder /app/server /server


# Run the web service on container startup.

CMD ["/server"]


查看完整回答
反对 回复 2023-08-21
  • 3 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信