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_VERSIONENV) | 
| 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 0briefly to fix perms | 
| AWS auth errors | Confirm env vars, or mount ~/.awswith 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.