Home > Net >  failed to create a docker for node-alpine in aws lambda
failed to create a docker for node-alpine in aws lambda

Time:11-15

I have got the following error while trying to create a docker image for aws lambda base on node js typescript image (NestJs) this error occurred also when i use sample app.js file with handler function

internal/modules/cjs/loader.js:905
  throw err;
  ^

Error: Cannot find module '/function/main.handler'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
    at Function.Module._load (internal/modules/cjs/loader.js:746:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []

my running command:

docker run --rm -p 9001:8080 lambda-test:latest
ARG FUNCTION_DIR="/function"

#*****************************************************************************
#  Builder Stage
#****************************************************************************/
FROM node:14-alpine AS builder

# Include global arg in this stage of the build
ARG FUNCTION_DIR

# The working directory is where "npm install" created the node_modules folder.
WORKDIR ${FUNCTION_DIR}

# Install aws-lambda-cpp build dependencies. aws-lambda-cpp is used by aws-lambda-ric which is a
# node-gyp compiled dependency. Find it in package.json.
# See the Node.js example at https://github.com/aws/aws-lambda-nodejs-runtime-interface-client

RUN apk add --no-cache \
    libstdc   \
    build-base \
    libtool \
    autoconf \
    automake \
    libexecinfo-dev \
    make \
    cmake \
    libcurl \
    python3


RUN mkdir -p ${FUNCTION_DIR}
COPY . ${FUNCTION_DIR}

# Install the AWS Lambda Runtime Interface Client (RIC) that is only required within this Docker container (not in package.json on development machine).
# It helps AWS to run the Lambda function code that autoiXpert provides.
RUN npm install
RUN npm install aws-lambda-ric
RUN npx tsc
RUN npm prune --production
#*****************************************************************************
#  Production Stage
#****************************************************************************/
FROM node:14-alpine

# Include global arg in this stage of the build
ARG FUNCTION_DIR

# The working directory is where "npm install" created the node_modules folder.
WORKDIR ${FUNCTION_DIR}

# If this directory does not exist, lambda shows an annoying warning.
RUN mkdir -p /opt/extensions

COPY --from=builder ${FUNCTION_DIR}/node_modules ${FUNCTION_DIR}/node_modules
COPY --from=builder ${FUNCTION_DIR}/package*.json ${FUNCTION_DIR}
COPY --from=builder ${FUNCTION_DIR}/dist/src* ${FUNCTION_DIR}

CMD [ "main.handler" ]

all the files located properly

when i used the aws base image its works good but the image size is araound 800mb with alpine is 300mb

CodePudding user response:

You missed ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"] in your Dockerfile's final stage.

Image node:14-alpine's default ENTRY_POINT is

#!/bin/sh
set -e

if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ]; then
  set -- node "$@"
fi

exec "$@"

So CMD [ "main.handler" ] is equivalent to node main.handler, which causes Error: Cannot find module '/function/main.handler'.

To fix this, you should change entrypoint to aws-lambda-ric with

ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"]
  • Related