使用 Node js 将 Angular 应用程序作为 docker 镜像运行

Posted

技术标签:

【中文标题】使用 Node js 将 Angular 应用程序作为 docker 镜像运行【英文标题】:Running Angular app as docker image using Node js 【发布时间】:2019-11-04 07:51:45 【问题描述】:

尝试在 docker 中构建 Angular 应用程序并使用 Node js 在我的本地作为容器运行。

我已经使用下面的 Dockerfile 构建映像,但我不确定我在运行时缺少什么。谁能指出我?

Dockerfile:

FROM node:10.15.3
ENV HOME=/home
WORKDIR $HOME
RUN npm config set strict-ssl false \
    && npm config set proxy http://proxy.xxxxxx.com:8080
COPY package.json .
RUN npm install

使用以下命令成功创建图像

docker build -t example .

我正在尝试使用以下命令运行映像,但它没有帮助

docker run -p 4201:4200 example

【问题讨论】:

你想达到什么目的?您的构建映像只会为您的 Angular 应用程序安装依赖项。 执行上述 docker run 命令后,我没有看到 docker 容器正在运行。我已经使用 docker ps 进行了验证。 如果我是你,我会添加有关这是用于生产还是开发用例的详细信息。基于此,您可能会得到不同的答案。基本上ng cli 不适合在生产中为应用程序提供服务。你应该使用合适的服务器,比如 nginx 或类似的东西。 【参考方案1】:

您的 Dockerfile 不会运行/服务于您的应用程序,为此您必须:

安装 angular/cli 复制应用程序 运行/提供应用程序
FROM node:10.15.3

RUN npm config set strict-ssl false \
    && npm config set proxy http://proxy.xxxxxx.com:8080

# get the app
WORKDIR /src
COPY . .

# install packages
RUN npm ci
RUN npm install -g @angular/cli

# start app
CMD ng serve --host 0.0.0.0

希望这会有所帮助。

【讨论】:

JFYI,使用 ng serve 在生产环境中运行 Angular 应用程序不是最佳实践。 对于完整的 Docker 初学者,如果你想在 Docker 中运行 Angular,这篇文章可能会有所帮助thecodeframework.com/…【参考方案2】:

容器需要一个前台进程运行,然后它不会退出。如果没有,容器将直接退出。

对于您的情况,您需要在docker build 时将您的nodejs 项目COPY 到容器中,并且还需要在CMD 中启动项目,例如CMD [ "npm", "start" ]。由于网络服务器没有退出,那么你的容器也不会退出。

一篇很好的文章 here 供您参考,了解如何对 Node.js Web 应用程序进行 docker 化。

【讨论】:

这篇文章非常好,了解了每个步骤的一些基本点。【参考方案3】:

只需更新您的 Dockerfile 即可实现您的目标,更多选项请参阅here:

# base image
FROM node:12.2.0

RUN npm config set strict-ssl false \
    && npm config set proxy http://proxy.xxxxxx.com:8080

# install chrome for protractor tests
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
RUN apt-get update && apt-get install -yq google-chrome-stable

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json
RUN npm install
RUN npm install -g @angular/cli@7.3.9

# add app
COPY . /app

# start app
CMD ng serve --host 0.0.0.0 

【讨论】:

【参考方案4】:

也试试下面的 Dockerfile!

FROM node:alpine

# get the app
WORKDIR /src

# install packages
RUN npm ci
RUN npm install -g @angular/cli
COPY package.json .
RUN npm install
COPY . .

# start app
CMD ["ng", "serve", "-o"]

【讨论】:

以上是关于使用 Node js 将 Angular 应用程序作为 docker 镜像运行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 从 Angular 将日期插入 MySQL DATETIME 列?

如何将 Angular 4 添加到现有的 node.js 应用程序

使用 Node 的 http 模块提供 angular.min.js [重复]

将 JSON 从 angular.js 发送到 node.js

Angular、Node.js、MySQL 图片上传

使用 Angular.js 和 Node.js 构建实时应用程序的更好方法是啥?