Go应用Docker化部署AWS Lambda遇exec /main文件未找到错误
Go应用Docker化部署AWS Lambda遇到执行文件找不到问题
问题背景
我有一个Go语言应用,计划将其Docker化后部署到AWS Lambda,应用使用bimg库处理图片压缩,因此依赖libvips组件。
我的Dockerfile
FROM golang:1.21 as build WORKDIR /app RUN apt-get update RUN apt-get install -y libvips libvips-dev COPY go.mod go.sum ./ COPY main.go . RUN GOOS=linux GOARCH=amd64 go build -o main main.go FROM alpine:3.19 COPY --from=build /app/main /main ENTRYPOINT [ "/main" ]
精简版Go代码
package main import ( "context" "log" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/h2non/bimg" ) var ( s3Client *s3.Client ) func init() { cfg, err := config.LoadDefaultConfig(context.Background()) if err != nil { log.Fatalf("failed to load AWS config: %v", err) } s3Client = s3.NewFromConfig(cfg) } func main() { lambda.Start(Handler) } func Handler(ctx context.Context, event events.S3Event) error { // 压缩、上传等业务逻辑 return nil }
遇到的错误
在AWS控制台测试Lambda时,出现exec /main: no such file or directory错误;本地执行docker run --rm -it s3-image-compressor-lambda:latest运行镜像时,同样报该错误。我清楚Lambda无法在本地正常运行,但预期应该出现运行时错误,而非文件找不到的提示。
调试过程及结果
为排查问题,我在Dockerfile中添加了调试命令:
- 在复制
main文件后添加RUN ls -l /,输出显示根目录下确实存在main文件:
#16 [stage-1 4/7] RUN ls -l / #16 0.354 total 18668 #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 bin #16 0.354 drwxr-xr-x 5 root root 340 Apr 4 22:28 dev #16 0.354 drwxr-xr-x 1 root root 4096 Apr 4 22:28 etc #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 home #16 0.354 drwxr-xr-x 7 root root 4096 Jan 26 17:53 lib #16 0.354 -rwxr-xr-x 1 root root 19055376 Apr 4 22:06 main #16 0.354 drwxr-xr-x 5 root root 4096 Jan 26 17:53 media #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 mnt #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 opt #16 0.354 dr-xr-xr-x 459 root root 0 Apr 4 22:28 proc #16 0.354 drwx------ 2 root root 4096 Jan 26 17:53 root #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 run #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 sbin #16 0.354 drwxr-xr-x 2 root root 4096 Jan 26 17:53 srv #16 0.354 dr-xr-xr-x 13 root root 0 Apr 4 22:28 sys #16 0.354 drwxrwxrwt 2 root root 4096 Jan 26 17:53 tmp #16 0.354 drwxr-xr-x 7 root root 4096 Jan 26 17:53 usr #16 0.354 drwxr-xr-x 12 root root 4096 Jan 26 17:53 var #16 DONE 0.4s
- 接着添加
RUN /main测试执行,输出为:
> [stage-1 8/8] RUN /main: 0.258 /bin/sh: /main: not found
内容的提问来源于stack exchange,提问作者Ahmet Yazıcı
相关产品推荐
相关产品推荐

