You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为AWS Lambda升级Node.js 16至20遇依赖问题求可行Dockerfile

升级Node.js 20到AWS Lambda时的Docker构建问题及解决方案

问题背景

将Node.js从16版本升级至20版本用于AWS Lambda时,遇到GLIBC版本不兼容错误:

"error Package: 2:nodejs-20.12.2-1nodesource.x86_64 (nodesource-nodejs) Requires: libc.so.6(GLIBC_2.28)(64bit)"

原Dockerfile基于amazon/aws-cli:2.8.3(该镜像依赖amazonlinux:2,GLIBC版本仅2.26,无法满足Node.js 20的GLIBC 2.28要求):

FROM amazon/aws-cli:2.8.3

RUN yum update -y \
    && curl --silent --location https://rpm.nodesource.com/setup_20.x | bash - \
    && yum install -y nodejs which zip \
    && yum clean all \
    && rm -rf /var/cache/yum

尝试过的方案及问题

  • 使用amazonlinux:2023作为构建阶段:出现DNS解析错误

    "Errors during downloading metadata for repository 'amazonlinux': Curl error (6): Couldn't resolve host name for https://cdn.amazonlinux.com/al2023/core/mirrors/2023.4.20240429/x86_64/mirror.list [getaddrinfo() thread failed to start]"
    对应的Dockerfile:

    FROM amazon/aws-cli:2.15.42
    FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as installer
    
    RUN yum update -y \
        && curl --silent --location https://rpm.nodesource.com/setup_20.x | bash - \
        && yum install -y nodejs which zip \
        && yum clean all \
        && rm -rf /var/cache/yum
    
  • 尝试AWS官方Lambda Node.js20镜像:无法正常工作

    FROM public.ecr.aws/lambda/nodejs:20.2024.05.01.10
    

Jenkins流水线配置

用于构建镜像的Jenkins代码:

podTemplate(yaml: """
kind: Pod
spec:
  containers:
    - name: docker
      image: docker:20.10.24
      command:
        - cat
      tty: true
""") {
    node(POD_LABEL) {
        checkout(scm)

        def gitTag = env.GIT_COMMIT.take(8)

        final String dockerRegistry = # my org repository
        final String dockerBuildContext = "./jenkins/"

        final String buildImageName = "dcim-aws-node-build"
        final String buildImageDockerfilePath = "./jenkins/build-container.Dockerfile"
        final GString buildImageTag = "${dockerRegistry}/dcim/${buildImageName}:${gitTag}"

        container('docker') {
            stage('Create build container') {
                cre.dockerBuild(
                        dockerRegistry: dockerRegistry,
                        dockerImageTag: buildImageTag,
                        dockerfilePath: buildImageDockerfilePath,
                        dockerBuildContext: dockerBuildContext
                )
            }
        }
    }
}

可行的Dockerfile方案

方案1:基于Amazon Linux 2023构建(匹配Lambda环境)

如果Jenkins Pod网络正常,直接使用amazonlinux:2023作为基础镜像,同时集成AWS CLI:

# 构建阶段:安装Node.js 20及依赖工具
FROM public.ecr.aws/amazonlinux/amazonlinux:2023 as installer

RUN dnf update -y \
    && dnf install -y curl which zip \
    && curl --silent --location https://rpm.nodesource.com/setup_20.x | bash - \
    && dnf install -y nodejs \
    && dnf clean all \
    && rm -rf /var/cache/dnf

# 最终镜像:复制已安装的工具并添加AWS CLI
FROM public.ecr.aws/amazonlinux/amazonlinux:2023

COPY --from=installer /usr/bin/node /usr/bin/node
COPY --from=installer /usr/bin/npm /usr/bin/npm
COPY --from=installer /usr/bin/which /usr/bin/which
COPY --from=installer /usr/bin/zip /usr/bin/zip

RUN dnf install -y aws-cli \
    && dnf clean all \
    && rm -rf /var/cache/dnf

方案2:基于官方Lambda Node.js20镜像扩展

直接在Lambda官方镜像基础上安装所需工具,确保运行环境一致性:

FROM public.ecr.aws/lambda/nodejs:20.2024.05.01.10

# 安装AWS CLI、which、zip等构建工具
RUN dnf update -y \
    && dnf install -y aws-cli which zip \
    && dnf clean all \
    && rm -rf /var/cache/dnf

方案3:轻量Alpine镜像方案(非严格匹配Lambda环境)

如果不需要严格对齐Amazon Linux环境,可使用体积更小的Node.js官方Alpine镜像:

FROM node:20-alpine

# 安装AWS CLI及依赖工具
RUN apk add --no-cache aws-cli zip which

补充说明

  • 方案1、2基于Amazon Linux 2023,完全匹配Lambda运行时环境,避免兼容性风险;
  • 方案3镜像体积更小,但需注意Lambda层/代码包的兼容性(优先推荐方案1/2);
  • 若Jenkins Pod存在DNS解析问题,可在Dockerfile中添加DNS配置:RUN echo "nameserver 8.8.8.8" >> /etc/resolv.conf,或检查Jenkins集群的网络策略。

内容的提问来源于stack exchange,提问作者Gurkirat Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:43:32