在Ubuntu镜像上安装Angular时的RUN失败

78次阅读
没有评论

问题描述

正在尝试为其Angular应用程序创建一个镜像,以便运行单元测试和端到端(E2E)测试。他从Ubuntu镜像开始,然后安装其他组件。他的Dockerfile包含以下语句:

FROM ubuntu:focal-20201008
RUN apt update && apt install -y \
    nginx \
    nodejs \
    npm \
    && npm install -g @angular/cli@9.1.12 \
    && rm -rf /var/lib/apt/lists/*

在构建镜像时,他遇到了错误,下面是部分错误信息:

npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
/usr/local/bin/ng -> /usr/local/lib/node_modules/@angular/cli/bin/ng
> @angular/cli@9.1.12 postinstall /usr/local/lib/node_modules/@angular/cli
> node ./bin/postinstall/script.js
The command '/bin/sh -c apt update && apt install -y     nginx     nodejs     npm     && npm install -g @angular/cli@9.1.12     && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 1

解决方案

请注意以下操作可能受版本差异影响,建议在操作前备份。

使用Node镜像创建Docker镜像

一种解决方案是使用Node镜像作为基础镜像来构建Docker镜像,这样可以避免与Ubuntu镜像相关的问题。以下是步骤:

  1. 创建一个Dockerfile(比如 Dockerfile.angular)。
  2. 使用Node镜像作为基础镜像。
  3. 在Dockerfile中添加安装Angular和其他依赖的命令。

下面是一个示例的Dockerfile.angular文件:

# 使用Node镜像作为基础镜像
FROM node:15.1.0 as ab-suite-image

# 设置工作目录
WORKDIR /opt/ng

# 安装Angular和其他依赖
RUN npm install -g @angular/cli@9.1.12 @angular/core @angular/common eslint chokidar jquery popper.js tslib --save

# 拷贝项目文件并构建
COPY . ./
RUN ng build

# 暴露端口
EXPOSE 4200 443

然后使用以下命令构建Docker镜像:

docker build -t abui -f Dockerfile.angular .

避免npm WARN警告

在安装依赖时出现的npm WARN警告通常是因为依赖包版本之间存在冲突或已过时。您可以尝试以下方法来避免这些警告:

  1. 确保依赖名称正确,版本兼容。可以尝试更新到更稳定的依赖版本。
  2. 尝试使用--legacy-peer-deps标志来安装依赖,以防止出现依赖解析问题。例如:
    bash
    npm install --legacy-peer-deps

避免Angular Analytics提示

如果Angular提示是否共享分析数据给Angular团队,您可以通过在安装Angular时关闭这个选项来避免。您可以尝试在Dockerfile中的安装命令之前添加以下步骤:

RUN ng analytics off

这将在安装Angular之前关闭分析功能。

分离Nginx和Angular应用

对于生产环境,不建议在同一容器中运行Nginx和Angular应用。而是建议将它们分别运行在不同的容器中。您可以构建一个Nginx容器来提供静态资源。以下是一个简单的示例:

  1. 创建一个Nginx配置文件,比如 nginx.conf
  2. 创建一个Dockerfile(例如 Dockerfile.nginx)来构建Nginx镜像。

以下是示例的Nginx配置文件 nginx.conf

server {
    listen 80;
    server_name localhost;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

然后是Dockerfile.nginx文件:

# 使用Nginx镜像作为基础镜像
FROM nginx:latest

# 将Nginx配置文件复制到容器中
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 将Angular构建后的文件复制到Nginx的默认网站目录
COPY dist/your-angular-app /usr/share/nginx/html

# 暴露Nginx端口
EXPOSE 80

使用以下命令构建Nginx镜像:

docker build -t nginx-angular -f Dockerfile.nginx .

然后您可以分别运行Angular和Nginx容器,并使用Docker网络将它们连接在一起。

请注意,这些解决方案都是基于您提供的问题和回复数据而提供的。具体操作可能因版本变化或其他因素而有所不同。建议您根据实际情况进行调整。

正文完