我刚刚在Docker容器中部署了我的Angular项目。我访问该网站的路径是:localhost:4200,因为在我的机器上监听的是4200,但在容器内部监听的是端口80。我使用的是Angular routing,文件如下:
const routes: Routes = [
{ path: 'Login', component: LandingPageComponent},
{ path: '', component: AppComponent},
{ path: 'Home', component: BlogHomeComponent, canActivate:[AuthGuard],
children:[
{ path: '', component: BlogHomeComponent},
{ path: "Posts", component: PostsComponent},
{ path: 'NewPost', component: CreatePostComponent},
{ path: 'Post/:id', component: SinglePostComponent}
]}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
这是我的AuthGuard:
@Injectable({
providedIn: 'root'
})
export class AuthGuard {
constructor(private authService: AuthService, private route: Router){}
canActivate():boolean {
if(this.authService.isLoggedIn() == true){
return true;
} else {
this.route.navigateByUrl("");
return false;
}
}
}
它应该检查每次我试图访问路由,如果我登录。当我从consolde(没有docker)运行应用程序时,它工作得很好。每次我试图访问一个路径,它检查我是否登录,当我没有它直接把我扔到登录页面。但是当我在docker容器中部署应用程序时,这并不起作用。当我转到一个不允许我访问的页面时,我在浏览器中得到这个错误:x1c 0d1x为什么?如果我从angular cli(使用ng服务器)运行它时转到完全相同的链接(localhost:4200/Home/Posts),如果我没有登录,它实际上会将我推回登录。
编辑
下面是Angular项目的Dockerfile:
FROM node:latest as node
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build --prod
FROM nginx:alpine
COPY --from=node /app/dist/front-end-blog-demo /usr/share/nginx/html
这里是Docker-compose文件,因为我在后端和前端都运行docker-compose:
version: "3.8"
services:
frontend:
build: ./FrontEnd-BlogDemo
ports:
- 4200:80
backend:
build: ./BackEnd-BlogDemo
ports:
- 8080:80
1条答案
按热度按时间jv4diomz1#
您必须正确设置您的Web服务器。如果找不到页面,则Web服务器应返回
index.html
。它永远不会抛出404
。你没有提供关于你的Docker-Image的信息,所以我只能让你参考这个页面https://angular.io/guide/deployment#server-configuration
编辑
是的,nginx是你的Web服务器。你需要一个配置文件,这样nginx就不会返回
404
。这是我的一个项目,上面有一个nginx。我为你标出了重要的一行。
https://github.com/AndreKoepke/home-system/blob/master/frontend/nginx/conf.d/default.conf#L39
你也可以看看我的dockerfile,看看如何把配置到nginx。
最后一个小提示:你在dockerfile中使用了
npm install
。您应该使用npm ci
。