Docker NodeJs 服务模板

记录一下之前单机 Docker 化 NodeJs 服务一些配置。

Dockerfile

# 基础镜像
FROM node:alpine

# 设置时区
RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

# 工作目录
WORKDIR /usr/src/app

COPY ./entrypoint.sh /usr/local/bin/

RUN apk --no-cache add curl

# 设置源
RUN npm config set registry https://registry.npm.taobao.org

# 安装 PNPM
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

# 设置脚本可执行
RUN chmod +x /usr/local/bin/entrypoint.sh

Docker Compose

version: "3"
services:
  gadfly:
    build: ./ # 构建路径
    image: xxx:v1 # 自定义镜像名称
    container_name: xxx_server # 自定义容器名称
    command: /bin/sh -c entrypoint.sh # 运行启动脚本
    expose:
      - 3000
    networks:
      - nginx_proxy # 为了和其他容器互通而建立的网络
    volumes:
      - ./:/usr/src/app # 映射文件

networks:
  nginx_proxy:
    external: true

启动服务脚本

由于我的是 NestJs ,每次运行前需要 build, 像 EggJs 可以在脚本里判断 node_modules 存在与否来决定是否需要执行依赖安装等操作。

#!/bin/sh
set -e
set -o pipefail


echo "[i] ***** current path *****"
echo `pwd`

echo "[i] ***** pnpm install *****"
pnpm install

echo "[i] ***** building *****"
npm run build

echo "[i] ***** server start *****"
npm run start:prod