这是可能的。在典型的 MERN 堆栈中,我使用concurrently 在不同的端口和相同的部署中并行运行我的React.js 应用程序和Express.js 应用程序。在这种情况下可以使用类似的设置。
以下示例已使用 Google Cloud Platform 的 App Engine (Flexible environment) 进行测试
假设你有一个这样的项目结构:
~/project
|- Dockerfile
|- app.yaml
|
|- service1
|| - index.js
|| - package.json
|| ...
|
|- service2
|| - index.js
|| - package.json
|| ...
假设您的 express 应用程序是使用 express-generator 创建的,那么事实上,在创建时,两个应用程序都在同一端口上运行,如 ./service1/bin/www 和 ./service2/bin/www 中的此特定行所示:var port = normalizePort(process.env.PORT || '3000'); .相反,您可以让 service1 的 bin/www 保持不变,以便它继续侦听 process.env.PORT,在这种情况下为 8080,并改为编辑 ./service2/bin/www,使其在您喜欢的任何特定端口上运行,而不是 8080 或 3000,例如,假设您希望在端口 3005 上运行它。
接下来,您必须编辑 service1 的 package.json 以便在 npm start 上同时在各自的端口上运行这两个应用程序。可以这样做:
"scripts": {
"start": "concurrently \"node ./bin/www\" \"node ../service2/bin/www\""
}
不幸的是,默认情况下不会打包并发,因此此命令可能会产生无法识别的错误。因此,您可以使用 Dockerfile,其目的是指定运行时映像以及部署的构建步骤(npm 安装两个应用程序,npm install -g concurrently 后跟 npm start)
FROM gcr.io/google_appengine/nodejs
COPY . /app/
RUN cd ./service1 && npm install
RUN cd ./service2 && npm install
RUN npm install -g concurrently
CMD cd ./service1 && npm start
最后,提供一个app.yaml 文件,该文件将指定使用的运行时以及环境。
runtime: custom
env: flex