Minimal, repeatable build & deployment container for AWS Serverless Framework services. Intended for CI environments like Bitbucket Pipelines, AWS CodeBuild, GitHub Actions, GitLab CI, etc.
Baseline runtime: Node.js 22 (Alpine) — AWS Lambda supports
nodejs22.x(see: Lambda runtimes).
| Component | Details |
|---|---|
| Node.js | 22 (Alpine base image) |
| Serverless Framework | v4.20.2 (pinned via SERVERLESS_VERSION ENV) |
| AWS CLI v2 | Alpine package install |
| Package managers | npm (bundled), pnpm (global), Yarn (bundled) |
| Python 3 + pip | For plugins / build tooling needing Python |
| Shell & utils | bash, less, groff, ca-certificates |
| User | Non-root serverless (UID 1001), WORKDIR /app |
| Node Line | Branch / Tag | Status |
|---|---|---|
| 22 | 22.x |
Recommended (current focus) |
| 20 | 20.x |
Still supported (earlier Lambda support window) |
| 18 | 18.x |
Approaching end of support |
| 16 | 16.x |
Deprecated (legacy only) |
master tracks the active major (Node 22). Pin a major tag (22.x) for deterministic CI builds.
Pull the image:
docker pull jch254/docker-node-serverless:22Check versions:
docker run --rm jch254/docker-node-serverless:22 serverless --version
docker run --rm jch254/docker-node-serverless:22 node -vDeploy (mount your service directory):
docker run --rm -it \
-v "$PWD":/app \
-w /app \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_REGION=us-east-1 \
jch254/docker-node-serverless:22 \
serverless deploy --stage devpipelines:
default:
- step:
image: jch254/docker-node-serverless:22
caches:
- node
script:
- pnpm install # or npm ci / yarn install
- serverless deploy --stage devname: Deploy
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
container: jch254/docker-node-serverless:22
steps:
- uses: actions/checkout@v4
- name: Install deps
run: pnpm install --frozen-lockfile
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: us-east-1
run: serverless deploy --stage prodversion: 0.2
phases:
install:
runtime-versions: {}
build:
commands:
- pnpm install --frozen-lockfile
- serverless deploy --stage prodUse whichever you prefer:
# pnpm
pnpm install
serverless package
# npm
npm ci
serverless deploy
# Yarn
yarn install --frozen-lockfile
serverless removeProvide credentials via environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, optional AWS_SESSION_TOKEN, AWS_REGION) or mount a credentials directory:
docker run --rm \
-v $HOME/.aws:/home/serverless/.aws:ro \
-v $PWD:/app -w /app \
jch254/docker-node-serverless:22 serverless infoThe image runs as serverless (UID 1001). If you encounter permission issues writing to a bind mount created by root (e.g., on some CI agents), you can temporarily override the user:
docker run --rm -u 0 jch254/docker-node-serverless:22 chown -R 1001:1001 /appOr run a one-off global install:
docker run --rm -u 0 jch254/docker-node-serverless:22 npm install -g serverless-plugin-aws-alertsFROM jch254/docker-node-serverless:22
RUN npm install -g serverless-plugin-aws-alertsBuild:
docker build -t my/serverless-image:22 .Review the following when upgrading:
- Update any
runtimefields inserverless.ymltonodejs22.x(if not deploying via container images). - Serverless v4 drops deprecated CLI flags—remove legacy options (e.g. old
--aws-s3-accelerateif used). - Rebuild native dependencies (node-gyp) to target Node 22 ABI if packaging layers/binaries.
- Verify plugins are compatible; update to latest maintained versions.
| Symptom | Resolution |
|---|---|
| EACCES on write to /app | Ensure host directory ownership or run with -u 0 briefly to fix perms |
| AWS auth errors | Confirm env vars, or mount ~/.aws with correct profile |
| Plugin missing system libs | Create derived image adding apk add <lib> |
| Slow cold start bundle size | Use serverless package + prune dev deps, leverage layers |
- Serverless Framework: https://www.serverless.com/
- AWS Lambda runtimes: https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html
- pnpm: https://pnpm.io/
PRs welcome: keep layers minimal, versions pinned where helpful, and document added tools.
MIT
Feedback & improvements welcome.