简体   繁体   中英

Routing doesn't work after Dockerizing Angular app

Am new to Angular and Docker. I have developed an Angular 7 application and trying to dockerize it. I did see many tutorials and was able to build the Docker image. Below is my 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;"]

And i run the docker container using command

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

My container did start and after looking in the browser http://IP-address:8082/ I could see index html of my app. Apart from that none other url of my application like the login page ( http://IP-address:8082/login ) or dashboard ( http://IP-address:8082/dashboard ) works. I see 404 page not found issue. What else is missing to make sure routing works in my dockerized container?

Below is my default.conf file

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;
    #}
}

And my docker version is Docker version 17.03.2-ce. Any help appreciated

This is happening because the base nginx image will try to serve the requests from the docroot , so it will try to find a login.html when you send a request to /login .

To avoid this, you need nginx to serve the index.html no matter the request , and thus letting angular take care of the routes.

To do so, you will need to change your nginx.conf , which is currently in the image, to include the following :

try_files $uri $uri/ /index.html;

Instead of the default being:

try_files $uri $uri/ =404;

You can do so in many ways, but I guess the best approach is to have an extra command in your Dockerfile , that copies over the nginx configuration like so :

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

And have that nginx/default.conf file in your directory (containing the default nginx configuration) with the command specified above replaced.

EDIT

There is already images that does exactly that, so you can just use an image other than the official one, that is made specifically for that, and it should work fine: example

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM