# Define global args ARG FUNCTION_DIR="/home/app/" ARG RUNTIME_VERSION ARG DISTRO_VERSION # Stage 1 - bundle base image + runtime # Grab a fresh copy of the image and install Node FROM ubuntu:${DISTRO_VERSION} AS node-ubuntu # Non-interactive mode ENV DEBIAN_FRONTEND=noninteractive # Install NodeJS ARG RUNTIME_VERSION RUN apt-get update && \ apt-get install -y \ curl && \ curl -sL https://deb.nodesource.com/setup_${RUNTIME_VERSION}.x | bash - && \ apt-get install -y nodejs # Stage 2 - build function and dependencies FROM node-ubuntu AS build-image ARG ARCHITECTURE # Install aws-lambda-cpp build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ gcc \ tar \ curl \ gzip \ make \ cmake \ autoconf \ automake \ libtool \ wget \ libcurl4-openssl-dev # Install a modern CMake RUN wget --quiet -O cmake-install https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-linux-${ARCHITECTURE}.sh && \ sh cmake-install --skip-license --prefix=/usr --exclude-subdirectory; # Include global arg in this stage of the build ARG FUNCTION_DIR # Create function directory RUN mkdir -p ${FUNCTION_DIR} # Copy & build Runtime Interface Client package (as we're installing it from a local filesystem source) WORKDIR ${FUNCTION_DIR}/deps/aws-lambda-ric COPY . . # Node14 uses npm@6.14.18 by default which will downgrade permissions, if it's root, # before running any build scripts: https://github.com/npm/npm/issues/3497 # Starting from npm@7.0.0, when npm is run as root, # scripts are always run with the effective uid and gid of the working directory owner. RUN if [ $(node -v | cut -c 1-3) = "v14" ] ; then npm install -g npm@7 ; fi RUN make build && \ npm run test:unit # Copy function code COPY test/integration/test-handlers/echo/* ${FUNCTION_DIR} # Install the function's dependencies WORKDIR ${FUNCTION_DIR} RUN npm install # Stage 3 - final runtime image # Grab a fresh copy of the Node image FROM node-ubuntu # Required for Node runtimes which use npm@8.6.0+ because # by default npm writes logs under /home/.npm and Lambda fs is read-only ENV NPM_CONFIG_CACHE=/tmp/.npm # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the built dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} ENTRYPOINT [ "/usr/bin/npx", "aws-lambda-ric" ] CMD [ "index.handler" ]