我会选择 Docker。一个容器运行节点映像,另一个容器运行 mysql 映像。节点容器将运行您的 Angular 和 Express 应用程序。同样使用 Docker,您的开发环境和生产环境之间将没有区别。
你有安装 Docker 吗?您使用的是哪个操作系统?
从 Docker Hub 下载节点映像:
docker pull node
然后我会创建一个 Dockerfile 来从节点图像生成一个图像,同时复制你所有的源代码。
FROM node:latest
LABEL author="Your Name"
ENV NODE_ENV=production PORT=3000
COPY . /app
WORKDIR /app
RUN npm install
EXPOSE $PORT
ENTRYPOINT ["npm", "start"]
COPY 命令会将当前目录 (.) 的源代码复制到容器内的 app 目录。 WORKDIR 将设置您的命令将在容器内执行的上下文,以便您可以在 package.json 所在的位置运行 npm install。 RUN 将下载容器内的所有应用程序依赖项。 ENTRYPOINT 将执行将启动您的应用程序的文件,如您的 package.json 文件中指定的那样,如下所示:
"name": "app",
"version": "1.0.0",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index.js"
},
"license": "ISC",
"dependencies": { ... }
.dockerignore 文件(因此您无需在容器内复制节点模块、Dockerfile 等):
node_modules
npm-debug.log
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
根据上面的 Dockerfile 创建镜像(你需要将 Dockerfile 和 docker build 放在你的应用容器的同一个文件夹中):
docker build -t image_name .
在 Docker 容器中运行您的映像:
docker run -d -p 3000:3000 image_name
像这样运行容器,您可以使用 DOCKER_HOST_IP:PORT 在浏览器中打开您的应用程序,它将运行您的应用程序。
假设您在 PORT 3000 中运行您的应用程序,我们将外部 3000 端口映射到运行您的应用程序的容器内的内部端口 3000。
快递
为了让 express 提供你的文件,你需要设置 express.static:
// serve client side code.
app.use('/', express.static('app_folder'));