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

368yc8dk  于 2022-11-28  发布在  Docker
关注(0)|答案(3)|浏览(308)

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

谢谢你的帮助。

pw136qt2

pw136qt21#

潜在问题1

如果将alpine更改为debian对您有效,则意味着这是交叉编译的问题。
golang映像是基于debian的,使用glibc,alpine映像使用musl libc。有时这些映像有不兼容性,并在最糟糕的错误信息中暴露自己。
所以我怀疑这不是Cloud Run的问题,而是之前的问题。

潜在问题2

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

gcuhipw9

gcuhipw92#

尝试将RUN chmod a+x添加到最终构建。

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

yxyvkwin3#

我得到的权限被拒绝的错误,以及使用后,这个Firebase教程提供的Dockerfile为GoLang的云运行。
显然,这可能是因为alpine linux被如此精简,以至于它缺少了容器正确构建或运行所需的关键包。
对于我的情况,它缺少git。我将git添加到RUN行,就在ca-certificates之后,以确保它已安装。在此更改之后,我的Cloud Run示例工作正常。
更多细节请参见Docker Library GoLang Github上的评论。

# 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"]

相关问题