Маршрутизация не работает после приложения Dockerizing Angular - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в Angular и Docker.Я разработал приложение Angular 7 и пытаюсь его докернизировать.Я видел много уроков и смог создать образ Docker.Ниже мой Dockerfile

FROM nginx:1.13.3-alpine
## Remove default nginx website
RUN rm -rf /usr/share/nginx/html/*
COPY ./ /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

И я запускаю Docker-контейнер с помощью команды

docker run -d --name containerName -p 8082:80 imagename

Мой контейнер запустился и после просмотра в браузере http://IP -адрес: 8082/ Я мог видеть индекс HTML моего приложения.Кроме этого, не работает ни один другой URL моего приложения, например страница входа (http://IP -адрес: 8082 / login ) или панель управления (http://IP -адрес: 8082 / панель управления ),Я вижу, 404 страница не найдена проблема.Чего еще не хватает, чтобы убедиться, что маршрутизация работает в моем докеризованном контейнере?

Ниже приведен мой файл default.conf

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

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

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

И моя версия докера - Docker версия 17.03.2-ce.Любая помощь приветствуется

1 Ответ

0 голосов
/ 18 декабря 2018

Это происходит потому, что базовое nginx изображение будет пытаться обслуживать запросы от docroot, поэтому оно попытается найти login.html при отправке запроса на /login.

* 1006.* Чтобы избежать этого, вам нужен nginx для обслуживания index.html независимо от запроса , и, таким образом, angular позаботится о маршрутах.

Для этого вам необходимо изменить nginx.conf, который в данный момент находится на изображении, на следующее:

try_files $uri $uri/ /index.html;

Вместопо умолчанию:

try_files $uri $uri/ =404;

Вы можете сделать это разными способами, но я думаю, что лучший подход - это иметь в вашем Dockerfile дополнительную команду, которая копирует конфигурацию nginxвот так:

COPY nginx/default.conf /etc/nginx/conf.d/default.conf

И замените этот файл nginx/default.conf в вашем каталоге (содержащий конфигурацию nginx по умолчанию) с заменой указанной выше команды.

EDIT

Уже есть изображения, которые делают именно это, так что вы можете просто использовать изображение, отличное от официального, которое сделано специально для этого, и оно должно работать нормально: пример

...