我正在尝试使用NGINX在Docker中部署Angular 10 Web应用程序,但是我无法使它被服务。在Google上搜寻了很多零散的信息,但我找到了以下步骤:
通常在Docker外为生产环境(
--prod
)构建Angular应用程序。结果保存在项目的dist
文件夹中,然后将其复制到容器中。我发现其他示例在容器内使用多阶段构建,但出于可扩展性的目的不建议这样做。无论如何,手动构建应用程序让我更容易控制结果,所以对我来说这是正确的方式。提供一个
nginx:alpine
的Dockerfile,其中我只需将自定义配置和编译后的应用程序复制到容器中,然后通过ENTRYPOINT
将其作为可执行文件运行:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
WORKDIR /usr/share/nginx/html
COPY dist/myapp/ .
ENTRYPOINT ["nginx", "-g", "daemon off;"]
这样,NGINX的日志应该会被重定向到控制台,因此显示在容器的终端中。
- 核心内容在NGINX配置文件中。我对此了解不多,但从https://blog.codecentric.de/en/2019/03/docker-angular-dockerize-app-easily/和https://denys.dev/2018-03-02/your-angular-apps-as-docker-containers/上的证据推断出以下内容,它应该正确地考虑了HTML 5路由(保存在同一文件夹中的
nginx.conf
文件):
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
include /etc/nginx/mime.types;
gzip on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
location / {
try_files $uri $uri/ /index.html;
}
}
}
我也发现了这个其他文章,但它对Angular的配置不够完整。
- 构建镜像(
docker build . -t myrepo/myapp:tag
)。在此过程中,发送dist
文件夹以外的无用内容需要花费很多时间。因此,遵循https://denys.dev/2018-03-02/your-angular-apps-as-docker-containers/中的提示("优化构建"),我添加了一个.dockerignore文件:
e2e
node_modules
src
这次构建速度比之前快多了。在两种情况下都成功构建了。
现在我可以直接运行容器(
docker run -d -p 4200:80 myrepo/myapp:tag
),或者通过 Docker Compose 脚本运行它。在这两种情况下,我都需要将容器的端口80(NGINX)重定向到主机端口4200(通常是 Angular 应用的本地主机端口)。问题:我期望在
localhost:4200
看到由 NGINX 提供的应用程序。但实际上我只看到了 NGINX 的默认欢迎页面,告诉我 NGINX 服务器已经成功安装并工作,但需要进一步配置。我查看了日志,但使用
docker logs mycontainer
并没有显示任何内容。我试图检查容器的文件系统,以查看 Angular 应用是否放置在正确位置(
usr/share/nginx/html
)。为此,我遵循了 Exploring Docker container's file system 中的建议:对于 alpine 镜像,由于没有 bash,所以我使用 docker export mycontainer > mydump.tar
将文件系统转储到 TAR 文件中。通过查看 TAR 的内容,我可以看到我的应用程序文件都在那里:index.html
,JS 文件,资产等等。我错过了什么来完成 NGINX 配置并让我的应用程序提供服务?
更新:
我按照 @Derek 的指示操作:删除了
.gitignore
,将我的 nginx.conf
替换为建议的配置文件,重新构建了应用程序,并运行了它。这一次构建大约花费了15分钟,并将1.134 GB 的构建上下文发送给 Docker 守护程序。为了在测试环境中快速运行它,我将镜像发布到 Docker Hub 中。整个项目都是开源的,因此如果有人想要在可重复的环境中诊断问题,则有二进制映像和其源代码。
- 镜像:
vedph2020/cadmus_web:1.0.5
(1.0.4
是我的nginx版本)。只需使用那里的docker-compose.yml
,为cadmus-web
服务标记版本号为1.0.5
。那里有一些后端内容,但我确定它能正常工作,因为我可以连接到其端点:localhost:60380/swagger。 - 代码库:https://github.com/vedph/cadmus_web(真实应用名称是
cadmus_web
;因此构建命令是docker build . -t vedph2020/cadmus_web:1.0.5
)。
同时,我尝试创建一个空的 Angular 应用程序,并使用原始的 Dockerfile 和 nginx 文件。令我惊讶的是,它可以工作。唯一的区别是虚拟的 Angular 应用程序没有路由,而我的应用程序使用了哈希位置策略。假设在 NGINX 中存在与哈希相关的配置问题,我尝试从 http://localhost:4200/#/home 访问我的应用程序,但并没有成功:显示了相同的欢迎页面。
/bin/sh
可以完成同样的操作。您能否检查/usr/share/nginx/html/index.html
是否包含您的代码? - Nick ODellexport
。就我所能从TAR中看到的,我的index.html
包含了预期的代码。 - Naftis