通过NGINX在Docker中提供Angular 10应用程序
我试图在Docker中使用NGINX部署Angular 10 web应用程序,但我无法让它提供服务。通过谷歌搜索,我发现了很多稀疏的信息,但我提出了以下步骤:通过NGINX在Docker中提供Angular 10应用程序,angular,docker,nginx,Angular,Docker,Nginx,我试图在Docker中使用NGINX部署Angular 10 web应用程序,但我无法让它提供服务。通过谷歌搜索,我发现了很多稀疏的信息,但我提出了以下步骤: 通常在Docker外部为生产(--prod)构建Angular应用程序。结果将保存到项目的dist文件夹中,然后将其复制到容器中。我发现了其他在容器中使用多阶段构建的示例;但出于可伸缩性的目的,不鼓励这样做。无论如何,手动构建应用程序可以让我更容易地控制结果,所以对我来说,这是一条路要走 使用nginx:alpine提供Dockerfi
--prod
)构建Angular应用程序。结果将保存到项目的dist
文件夹中,然后将其复制到容器中。我发现了其他在容器中使用多阶段构建的示例;但出于可伸缩性的目的,不鼓励这样做。无论如何,手动构建应用程序可以让我更容易地控制结果,所以对我来说,这是一条路要走
nginx:alpine
提供Dockerfile,我只需将自定义配置和已编译的应用程序复制到容器中,然后通过入口点将其作为可执行文件运行即可:
nginx.conf
,保存在Dockerfile
的同一文件夹中):docker-build.-t myrepo/myapp:tag
)。执行此操作时,将无用内容发送到dist
文件夹外需要花费大量时间。因此,根据“优化构建”的提示,我添加了一个.dockrignore,其中包含:docker run-d-p 4200:80 myrepo/myapp:tag
),或者从docker编写脚本运行容器。在这两种情况下,我都需要将容器的端口80(NGINX)重定向到主机端口4200(通常的Angular app localhost端口)
问题:我希望看到NGINX在localhost:4200
上为我的应用提供服务。相反,我发现的只是默认的欢迎NGINX页面,告诉我NGINX服务器已成功安装并工作,但需要进一步配置
我在日志中查找了一些内容,但mycontainer的docker日志没有显示任何内容
我试图检查容器的文件系统,看看Angular应用程序是否在它的位置(usr/share/nginx/html
)。为此,我遵循了以下建议:对于alpine映像,没有bash,因此我使用docker export mycontainer>mydump.TAR将文件系统转储到一个TAR文件中。通过查看TAR的内容,我可以看到我的应用程序文件在那里:index.html
、JS文件、资产等等
我在这里缺少什么来完成NGINX配置并获得应用服务
更新
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/name_of_your_app/ /usr/share/nginx/html
EXPOSE 80
我按照@Derek的指示:删除.gitignore
,用建议的nginx.conf
替换我的nginx.conf,重建应用程序,然后运行它。这次构建耗时约15分钟,并向Docker守护进程发送了1.134 GB的构建上下文
为了在我的测试机器上快速运行,我在Docker Hub中发布了该图像。整个项目都是开源的,因此,如果有人想在repo环境中诊断某个东西,那么二进制图像和它的源代码都有:
- 图片:
vedph2020/cadmus_web:1.0.5
(1.0.4
是我的nginx版本)。只需在那里使用docker compose.yml
,将标签1.0.5
用于cadmus web
服务。那里有一些后端的东西,但我确信它可以工作,因为我可以连接到它在localhost:60380/swagger的端点
- repository:(真正的应用程序名是
cadmus_web
;因此构建是docker构建。-t vedph2020/cadmus_web:1.0.5
)
同时,我尝试创建一个空的虚拟Angular应用程序,并使用我原来的Dockerfile和nginx文件。令我惊讶的是,它奏效了。唯一的区别是虚拟Angular应用程序没有路由,而我的应用程序使用哈希定位策略。假设NGINX中存在一些与散列相关的配置问题,我尝试从访问我的配置,但运气不佳:相同的欢迎页面。我向您介绍了如何使用我的容器。。。我看到所有的都是一样的,但请删除.dockrignore。。。你不需要忽略src。。。等,当您仅复制dist文件时
重要
运行ng build…时验证应用程序的名称。。。。去医院
文件夹并查看文件夹的名称,以验证它是否为我的应用程序
结构
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/name_of_your_app/ /usr/share/nginx/html
EXPOSE 80
这需要在应用程序的根目录中
src
dist
name_of_your_app
index.html //and the other files
e2e
node_modules
nginx.conf
Dockerfile
DOCKERFILE
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/name_of_your_app/ /usr/share/nginx/html
EXPOSE 80
NGINX CONF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
构建
docker build -t my_app .
跑步
docker run -d -p 4200:80 -t my_app
就这些。。。也许是一些配置,标签。。。这是你的问题。告诉我这是否解决了您的问题。我想我已经找到了问题所在:通过查看文件系统转储,我注意到了default.conf
文件;检查它的内容时,我看到在端口80上已经有一个localhost
的位置。我认为这应该不是问题,因为我的nginx.conf
文件没有导入(include
指令)它;但它似乎仍然得到评估。至少,一旦我在Dockerfile中删除了它:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
WORKDIR /usr/share/nginx/html
COPY dist/apps/cadmus/ .
EXPOSE 80
该应用程序现在按预期启动。希望这能帮助像我这样的新手,定义一个清晰的服务程序(我想无论如何我可以重新引入gzip
指令,甚至.dockrignore
)…对于阿尔卑斯山的形象,阿尔卑斯山没有bash
应该有/bin/sh
,这将让你完成同样的事情。您能检查一下/usr/share/nginx/html/index.html
是否包含您的
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
WORKDIR /usr/share/nginx/html
COPY dist/apps/cadmus/ .
EXPOSE 80