#angular #kubernetes #kubernetes-ingress #nginx-ingress
#angular #kubernetes #kubernetes-вход #nginx-вход
Вопрос:
У меня есть угловое приложение, которое отлично работает в среде разработки.
Когда я пытаюсь развернуть его в кластере Kubernetes и создать для него входной маршрут, все работает не так, как ожидалось.
В частности, я использую это определение входа
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: angular-website
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- backend:
serviceName: angular-website
servicePort: 80
path: /website(/($|.*))?
Когда я пытаюсь перейти к этому входному маршруту, я вижу пустую страницу и вкладку сети (в Chrome), я вижу эти ошибки
Я понимаю, что это происходит потому, что я пытаюсь маршрутизировать по некорневому пути (то есть по тому, чего нет /
), а Angular не «знает» об этом и предполагает, что приложение запускается из корневого пути, когда пытается загрузить все пакеты JS.
Я понимаю, что могу исправить это, отредактировав раздел в главном index.html
в моем приложении из
<base href="/">
Для
<base href="/website">
Но я бы предпочел этого не делать, поскольку это потребовало бы от меня знать путь заранее, во время сборки.
Есть ли способ обойти это? Есть ли способ заставить Angular динамически узнавать о корневом пути без необходимости перекомпилировать приложение, чтобы установить это?
Редактировать
Приложение Angular размещено в приложении NodeJS Express
const clientPath = path.join(__dirname, "..", "public", "angular-website", "dist", "angular-website");
app.use(express.static(clientPath));
app.get('/*', (req, res) => res.sendFile(path.join(clientPath, "index.html"));
Комментарии:
1. Настроен ли angular с помощью сервера nginx или apache? Если возможно, можете ли вы предоставить файл DockerFile
2. @Prashanna только что отредактировал сообщение. Я использую NodeJS Express для использования приложения Angular (у меня есть фрагмент кода маршрутизации). файл docker — это стандартный файл docker NodeJS, которым я могу поделиться, если хотите.
Ответ №1:
В итоге я создал угловое приложение в своем Dockerfile следующим образом
RUN npm run build -- --prod --base-href="/{{basePath}}" --deploy-url="{{basePath}}/"
по сути, во время сборки я передаю заполнитель аргументам --base-href
and --deploy-url
, которые указывают, какой корневой путь моего приложения.
Затем, когда я обслуживаю приложение Angular из своего процесса NodeJS Express, я использую mustache (механизм создания шаблонов), чтобы заменить там заполнители корневым путем моего приложения, который хранится в переменной среды.
res.render('index', {
basePath: process.env.CLIENT_BASE_PATH || ''
});