/lib64/libc.so.6:找不到版本“GLIBC_2.32”

utk*_*utk 20 aws-lambda spring-cloud-function graalvm-native-image

我正在使用基本示例在 Ubuntu 上构建 lambda。它构建时没有任何错误,但如果我在 aws 上上传并测试它,则会崩溃:

{
  "errorMessage": "RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b Error: Runtime exited with error: exit status 1",
  "errorType": "Runtime.ExitError"
}
Run Code Online (Sandbox Code Playgroud)

日志输出为:

START
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Version: $LATEST.~.jwtauthorizeraws.jwtauthorizerawsapplication: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./~.jwtauthorizerawsapplication)
END 
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
REPORT
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Duration: 56.02 ms
Billed Duration: 57 ms
Memory Size: 128 MB
Max Memory Used: 7 MB   
RequestId: 7f4d0aca-125c-4032-98dd-9ff387e5252b
Error: Runtime exited with error: exit status 1
Runtime.ExitError
Run Code Online (Sandbox Code Playgroud)

Mat*_*unt 17

我最近遇到了这个问题。

构建您的项目CGO_ENABLED=0可能足以解决您的问题

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
Run Code Online (Sandbox Code Playgroud)

如果您使用的是sam,则会有一个--use-container标志,但这可能不适用于 golang 项目

sam build使用自定义构建命令,即运行go build上面的命令,您可以设置BuildMethodmakefile创建一个Makefile名为 的目标build-<YourFunctionName>

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main main.go
Run Code Online (Sandbox Code Playgroud)

那么就会Makefile有:

build-HealthCheckFunction:
  GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o healthcheck lambda/healthcheck/healthcheck.go
  mv healthcheck $(ARTIFACTS_DIR)
Run Code Online (Sandbox Code Playgroud)

有关我必须做些什么才能在项目中解决此问题的更多详细信息,请参阅: https: //www.gaunt.dev/blog/2022/glibc-error-with-aws-sam-and-go/


小智 11

这可能意味着glibc用于构建可执行文件的版本与 docker 环境使用的版本不同。

因此,检查构建环境ldd --version将显示 glibc 版本。

现在,在您的 docker 容器 ( docker run -ti --entrypoint=/bin/bash dockerimage:tag) 中键入相同的ldd命令。您可能会发现版本不同。因此,更新构建环境以使用与 docker 环境相同的版本,反之亦然。

避免这种情况的最佳方法是使用运行时环境来构建本机可执行文件:这样版本glibc将始终匹配。


Ber*_*rka -1

您正在执行的环境似乎在版本 2.32 中不提供 Glibc 版本。

这可能会产生几个问题:您的 Lambda 环境版本较旧,或者根本不提供 GlibC(可能是这种情况)。

如果您的应用程序是纯java(不通过graal创建本机应用程序),它将运行,因为java应用程序本身不依赖于GLibC的版本,要求来自本机应用程序。