docker-deployment by pluginagentmarketplace/custom-plugin-nodejs
npx skills add https://github.com/pluginagentmarketplace/custom-plugin-nodejs --skill docker-deployment掌握使用 Docker 容器化并部署 Node.js 应用程序,以实现一致、可移植的部署。
只需 3 步即可将 Node.js 应用 Docker 化:
docker build -t myapp .docker run -p 3000:3000 myappFROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
# 生产阶段
FROM node:18-alpine
WORKDIR /app
# 从构建阶段复制
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app .
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
CMD node healthcheck.js || exit 1
CMD ["node", "src/index.js"]
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=myapp
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app
volumes:
postgres-data:
redis-data:
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f app
# 停止服务
docker-compose down
# 重新构建镜像
docker-compose up -d --build
# 扩展服务
docker-compose up -d --scale app=3
node_modules
npm-debug.log
.git
.gitignore
.env
.env.local
.vscode
*.md
tests
coverage
.github
Dockerfile
docker-compose.yml
# 构建镜像
docker build -t myapp:latest .
# 运行容器
docker run -d -p 3000:3000 --name myapp myapp:latest
# 查看日志
docker logs -f myapp
# 进入容器
docker exec -it myapp sh
# 停止容器
docker stop myapp
# 移除容器
docker rm myapp
# 列出镜像
docker images
# 移除镜像
docker rmi myapp:latest
# 清理未使用的资源
docker system prune -a
# 在 Dockerfile 中
ENV NODE_ENV=production
ENV PORT=3000
# 或在 docker-compose.yml 中
environment:
- NODE_ENV=production
- PORT=3000
# 或从 .env 文件加载
env_file:
- .env.production
services:
app:
volumes:
- ./logs:/app/logs # 绑定挂载
- node_modules:/app/node_modules # 命名卷
volumes:
node_modules:
# 在 Dockerfile 中
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD node healthcheck.js || exit 1
// healthcheck.js
const http = require('http');
const options = {
host: 'localhost',
port: 3000,
path: '/health',
timeout: 2000
};
const request = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
process.exit(res.statusCode === 200 ? 0 : 1);
});
request.on('error', (err) => {
console.log('ERROR:', err);
process.exit(1);
});
request.end();
# 使用 Alpine(更小的基础镜像)
FROM node:18-alpine # 180MB vs node:18 (1GB)
# 多阶段构建(移除构建依赖)
# 使用 .dockerignore(排除不必要的文件)
# 使用 npm ci 而不是 npm install(更快,确定性)
# 仅安装生产依赖
RUN npm ci --only=production
# 合并 RUN 命令(减少层数)
RUN apk add --no-cache git && \
npm ci && \
apk del git
FROM node:18-alpine
# 不要以 root 身份运行
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production
COPY --chown=nodejs:nodejs . .
USER nodejs
# 健康检查
HEALTHCHECK CMD node healthcheck.js || exit 1
# 使用 node 而不是 npm start(更好的信号处理)
CMD ["node", "src/index.js"]
# 登录
docker login
# 标记镜像
docker tag myapp:latest username/myapp:1.0.0
docker tag myapp:latest username/myapp:latest
# 推送到 Docker Hub
docker push username/myapp:1.0.0
docker push username/myapp:latest
# 从 Docker Hub 拉取
docker pull username/myapp:latest
name: Docker Build & Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v2
- uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: docker/build-push-action@v4
with:
push: true
tags: username/myapp:latest
cache-from: type=gha
cache-to: type=gha,mode=max
# 缓存 node_modules 层
COPY package*.json ./
RUN npm ci
COPY . . # 这不会重建 node_modules
# 直接使用 node(而不是 npm)
CMD ["node", "src/index.js"]
# 在应用中:处理 SIGTERM
process.on('SIGTERM', () => {
server.close(() => process.exit(0));
});
在以下情况下使用 Docker 部署:
每周安装量
222
代码仓库
GitHub 星标数
1
首次出现
Jan 21, 2026
安全审计
安装于
opencode202
gemini-cli195
codex189
cursor185
github-copilot181
claude-code159
Master containerizing and deploying Node.js applications with Docker for consistent, portable deployments.
Dockerize Node.js app in 3 steps:
docker build -t myapp .docker run -p 3000:3000 myappFROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
# Production stage
FROM node:18-alpine
WORKDIR /app
# Copy from builder
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app .
# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
CMD node healthcheck.js || exit 1
CMD ["node", "src/index.js"]
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=myapp
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- app
volumes:
postgres-data:
redis-data:
# Start services
docker-compose up -d
# View logs
docker-compose logs -f app
# Stop services
docker-compose down
# Rebuild images
docker-compose up -d --build
# Scale services
docker-compose up -d --scale app=3
node_modules
npm-debug.log
.git
.gitignore
.env
.env.local
.vscode
*.md
tests
coverage
.github
Dockerfile
docker-compose.yml
# Build image
docker build -t myapp:latest .
# Run container
docker run -d -p 3000:3000 --name myapp myapp:latest
# View logs
docker logs -f myapp
# Enter container
docker exec -it myapp sh
# Stop container
docker stop myapp
# Remove container
docker rm myapp
# List images
docker images
# Remove image
docker rmi myapp:latest
# Prune unused resources
docker system prune -a
# In Dockerfile
ENV NODE_ENV=production
ENV PORT=3000
# Or in docker-compose.yml
environment:
- NODE_ENV=production
- PORT=3000
# Or from .env file
env_file:
- .env.production
services:
app:
volumes:
- ./logs:/app/logs # Bind mount
- node_modules:/app/node_modules # Named volume
volumes:
node_modules:
# In Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD node healthcheck.js || exit 1
// healthcheck.js
const http = require('http');
const options = {
host: 'localhost',
port: 3000,
path: '/health',
timeout: 2000
};
const request = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
process.exit(res.statusCode === 200 ? 0 : 1);
});
request.on('error', (err) => {
console.log('ERROR:', err);
process.exit(1);
});
request.end();
# Use Alpine (smaller base image)
FROM node:18-alpine # 180MB vs node:18 (1GB)
# Multi-stage build (remove build dependencies)
# Use .dockerignore (exclude unnecessary files)
# npm ci instead of npm install (faster, deterministic)
# Only production dependencies
RUN npm ci --only=production
# Combine RUN commands (fewer layers)
RUN apk add --no-cache git && \
npm ci && \
apk del git
FROM node:18-alpine
# Don't run as root
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production
COPY --chown=nodejs:nodejs . .
USER nodejs
# Health check
HEALTHCHECK CMD node healthcheck.js || exit 1
# Use node instead of npm start (better signal handling)
CMD ["node", "src/index.js"]
# Login
docker login
# Tag image
docker tag myapp:latest username/myapp:1.0.0
docker tag myapp:latest username/myapp:latest
# Push to Docker Hub
docker push username/myapp:1.0.0
docker push username/myapp:latest
# Pull from Docker Hub
docker pull username/myapp:latest
name: Docker Build & Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v2
- uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: docker/build-push-action@v4
with:
push: true
tags: username/myapp:latest
cache-from: type=gha
cache-to: type=gha,mode=max
# Cache node_modules layer
COPY package*.json ./
RUN npm ci
COPY . . # This doesn't rebuild node_modules
# Use node directly (not npm)
CMD ["node", "src/index.js"]
# In app: Handle SIGTERM
process.on('SIGTERM', () => {
server.close(() => process.exit(0));
});
Use Docker deployment when:
Weekly Installs
222
Repository
GitHub Stars
1
First Seen
Jan 21, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode202
gemini-cli195
codex189
cursor185
github-copilot181
claude-code159