本文介绍如何在本地制作Node.js镜像,并以镜像方式将应用部署到Serverless应用引擎SAE(Serverless App Engine)。
步骤一:准备项目
- 创建一个用于存放Node.js资源的项目文件夹,命名为node。
- 执行以下命令,进入项目目录。
- 创建并编辑server.js的文件,文件内容如下:
const ronin = require( 'ronin-server' )
const mocks = require( 'ronin-mocks' )
const server = ronin.server()
server.use( '/', mocks.server( server.Router(), false, true ) )
server.start()
- 创建并编辑package.json文件,文件内容如下:
{
"name": "node_sae_demo",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"ronin-mocks": "^0.1.4",
"ronin-server": "^0.1.3"
}
}
- 本地验证。
- 执行以下命令,安装依赖。
npm install --production
--production
表示只扫描dependencies节点下的依赖。
- 执行以下命令,运行项目。
- 打开一个新的终端,执行以下命令,查看请求是否返回正常。
curl 'http://127.0.0.1:8000/test'
输出如下。
- 新终端:
{"code":"success","meta":{"total":0,"count":0},"payload":[]}
- 现有终端,输出示例如下:
2021-**-**T14:36:05:1050 INFO: GET /test
步骤二:制作镜像
- 在node目录下,创建并编辑Dockerfile文件,文件内容如下:
本文以Node.js 12.18.1为例。
FROM node:12.18.1
ENV NODE_ENV=production
WORKDIR /app
COPY ["package.json", "./"]
# 可选,您也可以将本地的node_modules拷贝进来,而不是制作镜像的过程中再安装依赖,会拖慢镜像的构建。
# RUN COPY node_modules .
RUN npm install --production
COPY . .
# 如果没用pm2,可以不需要docker-entrypoint.sh。
COPY docker-entrypoint.sh /usr/local/bin/
CMD [ "node", "server.js" ]
- 在node目录下,创建并编辑docker-entrypoint.sh文件,文件内容如下:
#!/bin/sh
# https://github.com/nodejs/docker-node/blob/main/docker-entrypoint.sh
set -e
if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ]; then
set -- node "$@"
fi
# 启动命令前先清理部分对Node.js无用的环境变量,避免部分框架(PM2等)因为环境变量过长而导致系统崩溃。
echo "remove options"
unset JAVA_TOOL_OPTIONS
exec "$@"
- 在容器镜像服务控制台创建镜像仓库。
个人版和企业版实例均适用本文的操作,本文以个人版实例为例。具体操作,请参见以下文档:
- 执行以下命令,构建并推送镜像。
您可以在目标镜像仓库的
基本信息页面的
镜像指南页签查询具体命令。更多信息,请参见以下文档:
- 执行以下命令,构建镜像。
docker build --tag node-demo:v1 .
输出示例如下:
Sending build context to Docker daemon 12.82MB
Step 1/8 : FROM node:12.18.1
---> f5be1883****
......
Step 8/8 : CMD [ "node", "server.js" ]
---> Running in e96b27dd****
Removing intermediate container e96b27dd****
---> 73028a1d****
Successfully built 73028a1d****
- 执行以下命令,登录远端镜像仓库。
本步骤假设您使用的是阿里云ACR仓库。
docker login --username=<镜像仓库登录名> registry.<regionId>.aliyuncs.com
示例如下:
docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
在返回结果中输入密码,如果显示
login succeeded
,则表示登录成功。如何设置密码,请参见
设置镜像仓库登录密码。
- 执行以下命令,给镜像打标签。
docker tag <ImageId> registry.<regionId>.aliyuncs.com/****/node-demo:<镜像版本号>
ImageId
:镜像ID。
registry.<regionId>.aliyuncs.com/****/node-demo
:镜像仓库地址。
示例如下:
docker tag node-demo:v1 registry.cn-hangzhou.aliyuncs.com/****/node-demo:v1
- 执行以下命令,推送镜像至个人版实例。
docker push registry.<regionId>.aliyuncs.com/****/node-demo:<镜像版本号>
示例如下:
docker push registry.cn-hangzhou.aliyuncs.com/****/node-demo:v1
步骤三:部署镜像
- 创建Node.js应用。
在
应用部署配置配置向导页面,
技术栈语言需选择
其它语言,
应用部署方式需选择
镜像。具体操作,请参见
使用镜像部署多语言应用。

说明 除创建新应用外,您还可以修改现有应用的配置镜像。具体操作,请参见
升级应用。
- 为Node.js应用绑定公网SLB。
选择
HTTP协议,并将
HTTP端口设置为
80,
容器端口设置为
8000。具体操作,请参见
为应用绑定SLB。

绑定完成后,您可以在
应用访问设置区域查看公网访问地址。

- 结果验证。
按照
http://slbip:port/的格式,在浏览器地址栏输入
步骤2设置的公网地址并回车。结果如下:

更多信息
如果您不想每次都通过手动方式构建、推送镜像,并部署应用,可以对接开源的Jenkins或者阿里云云效。具体信息,请参见以下文档: