Angular universal与docker给出了错误的网关

rnmwe5a2  于 2023-06-05  发布在  Docker
关注(0)|答案(2)|浏览(248)

我正在尝试使用nginx对一个angular通用应用程序进行dockerizing,这给了我很大的困难。它一直在说502坏网关,我无法把我的头绕过去。
这是我的Dockerfile

FROM node:14-alpine AS builder
WORKDIR /app
COPY . .
RUN npm i && npm run build:ssr
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
RUN rm -rf ./*
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist/front-end-kevi .
ENTRYPOINT ["nginx", "-g", "daemon off;"]

在我的server.ts文件中,我在端口4000上启动应用程序。所以我使用这个命令启动docker镜像
docker run -d -p 4000:80 kevin
这里是我的nginx conf文件。

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;
    
    location ~* \.(eot|ttf|woff|woff2)$ {
    add_header Access-Control-Allow-Origin *;
    }

    location / {
        proxy_pass http://localhost:4000;
        try_files $uri $uri/ =404;
    }

    location /OrderMationApi/api/v3/ {
        proxy_pass http://102.133.225.222;
    }
}

我在错误日志中看到了这个错误
7#7:*1 connect()失败(111:连接被拒绝),同时连接到上游,客户端:172.17.0.1,服务器:localhost,请求:“GET / HTTP/1.1”,上行:“http://127.0.0.1:4000/“,host:“localhost:4000”
你知道我哪里做错了吗?任何帮助是高度赞赏。先谢谢你了。

2hh7jdfx

2hh7jdfx1#

你说你的服务器是在:4000上启动的,但我在你的Dockerfile中没有看到。从你在问题中发布的配置来看,在我看来,你相信你的容器将同时运行Nginx和你的应用程序。但会发生的是只有Nginx会运行,而你的应用程序不会启动。这就是为什么你会得到一个错误- Nginx无法在http://localhost:4000上找到任何东西,因为那里没有任何东西在监听。
要解决这个问题,您有几个选择。一个是你可以构建另一个容器来运行你的应用程序,然后将Nginx指向该容器。最好的方法是使用docker compose运行这两个容器,并将Nginx指向http://<service-name>:4000,其中<service_name>是另一个容器的名称。
另一种可能性是将入口点替换为同时启动它们的脚本。这不是一个容器最佳实践,但它是可能的。在这种情况下,您可以编写脚本(例如:/docker-entrypoint.sh),内容如下:

#!/bin/sh

nginx &
npx ts-node server.ts

这将在后台启动nginx,并在前台运行您的服务器。同样,这不是一个最佳实践,因为现在Nginx没有登录到stdout/stderr。因此,我建议使用docker compose之类的东西进行多容器设置。

相关问题