NodeJS Dockerfile

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。

本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
CA Certificate Authority 证书颁发机构
CI Continuous Integration 持续集成
CLI Command-Line Interface 命令行接口
HTTPS Hypertext Transfer Protocol Secure 使用 TLS 加密的 HTTP
MB Megabyte 十进制兆字节,1 MB = 10⁶ 字节
npm npm package manager Node.js 常用包管理器的名称,并非需强行展开的正式缩写
TLS Transport Layer Security 传输层安全协议
UTC Coordinated Universal Time 协调世界时

首次学习可先完成 Hello World 完整打包实验。

https://hub.docker.com/_/node
https://docs.docker.com/build/building/best-practices/
https://docs.docker.com/build/building/secrets/
https://docs.npmjs.com/cli/v11/commands/npm-ci
https://nodejs.org/api/cli.html

1. Important Points#

Node.js container rule:
    use npm ci
    do not copy .env into image
    run as non-root user
    write logs to stdout/stderr
    pass runtime config by env / secret / mounted file

common runtime env:
    NODE_ENV=production
    PORT=3000
    LOG_LEVEL=info
    NODE_OPTIONS=--enable-source-maps --max-old-space-size=512

2. Multi-stage Dockerfile#

# syntax=docker/dockerfile:1

FROM node:22-bookworm-slim AS deps
WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci

FROM node:22-bookworm-slim AS runtime
WORKDIR /app

ENV NODE_ENV=production PORT=3000 LOG_LEVEL=info NODE_OPTIONS="--enable-source-maps --max-old-space-size=512"

COPY --from=deps /app/node_modules ./node_modules
COPY package.json package-lock.json ./
COPY src ./src

RUN npm prune --omit=dev && npm cache clean --force

USER node

EXPOSE 3000

CMD ["node", "src/main.js"]
why:
    deps stage uses npm ci
    runtime stage keeps only production dependencies
    image runs as node user

3. Runtime-only Dockerfile#

不要把 .env 或 npm token COPY 进镜像;多阶段构建隔离构建依赖,runtime 镜像只保留运行所需内容。

# syntax=docker/dockerfile:1

FROM node:22-bookworm-slim
WORKDIR /app

ENV NODE_ENV=production PORT=3000 LOG_LEVEL=info NODE_OPTIONS="--enable-source-maps --max-old-space-size=512"

COPY package.json package-lock.json ./
RUN npm ci --omit=dev && npm cache clean --force

COPY src ./src

USER node

EXPOSE 3000

CMD ["node", "src/main.js"]
use this when:
    project is plain JavaScript
    no compile step is required
    CI already ran lint/test

4. Runtime Environment Variables#

docker run --rm -p 3000:3000 -e NODE_ENV=production -e PORT=3000 -e LOG_LEVEL=info -e NODE_OPTIONS="--enable-source-maps --max-old-space-size=768" order-api:runtime

common Node.js runtime env#

Env Example What It Does
NODE_ENV production application/runtime mode
PORT 3000 app listen port
LOG_LEVEL info application log level
NODE_OPTIONS --max-old-space-size=768 pass Node.js CLI flags
NODE_EXTRA_CA_CERTS /etc/ssl/private/company-ca.pem add extra trusted CA
NODE_TLS_REJECT_UNAUTHORIZED 1 TLS certificate verification
HTTP_PROXY http://proxy:8080 outbound HTTP proxy
HTTPS_PROXY http://proxy:8080 outbound HTTPS proxy
NO_PROXY localhost,127.0.0.1,.svc bypass proxy
TZ UTC timezone

common NODE_OPTIONS#

memory:
    --max-old-space-size=768
        set V8 heap max size in MB

diagnostics:
    --enable-source-maps
        better stack traces with source maps

    --trace-warnings
        print stack traces for process warnings

    --heapsnapshot-near-heap-limit=3
        write heap snapshots near heap limit

    --report-uncaught-exception
        generate diagnostic report on uncaught exception

    --report-on-fatalerror
        generate diagnostic report on fatal error

security / crypto:
    --tls-min-v1.2
        reject TLS versions below 1.2

    --tls-cipher-list=<cipher-list>
        customize TLS cipher list

    --use-openssl-ca
        use OpenSSL CA store

    --use-bundled-ca
        use Node.js bundled CA store

5. .dockerignore#

node_modules
coverage
.git
.env
.env.*
npm-debug.log
Dockerfile
docker-compose.yml

6. Build And Run#

docker build -t order-api:local .
docker run --rm -p 3000:3000 -e NODE_ENV=production -e PORT=3000 order-api:local

7. Docker Compose#

services:
  order-api:
    build:
      context: .
    ports:
      - "3000:3000"
    env_file:
      - .env.local
    environment:
      NODE_ENV: local
      PORT: "3000"
      LOG_LEVEL: debug
      NODE_OPTIONS: "--enable-source-maps --max-old-space-size=512"

8. Build Secrets#

docker build --secret id=npmrc,src="$HOME/.npmrc" -t order-api:local .
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc npm ci

9. Production Checklist#

image:
    npm ci
    production dependencies only
    no .env copied
    non-root user
    pinned Node major version

runtime:
    config injected by platform
    NODE_OPTIONS reviewed
    health check configured
    logs to stdout/stderr

CI:
    npm ci
    npm run lint
    npm test
    docker build
    image scan

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭