docker 部署 strapi 前端路由 bug问题

问题

​ 有一个需求,backend 代码需要部署到十几家 二十几家甚至更多家的代码,如果每一个都要重新打包镜像会比较麻烦。现在想要把这二十几家的项目部署到一台服务器,通过 域名/${企业名}/admin的方式访问,应该怎么部署比较方便且容易维护?

解决过程

在按照文档部署的过程中遇到一个问题,就是 .env中的环境变量在docker环境中不生效,设置了COMPANY_NAME却没法使用。 后来多次尝试才知道,.env在docker 环境下只是在 build的时候生效过一次,生成镜像之后,需要在docker-compose.yml添加environment, 这样在进入docker容器内,使用npm run build,就可以生效了。

注意:docker 启动的之后后端的服务,build文件(前端打包代码)只是在 docker build生成了一次,后面就固定不变了。

### config/server.js 里面的参数要改为 从Node 环境中获取,目前必须是绝对路径。


### 主要是从以下几个方面修改的代码


一。docker compose修改:解决前端的 admin 静态资源路径,总是找不到。
改 docker-compose.yml, 添加environment。 然后再进入到容器内,npm run build,就可以了。  注意,是先通过docker-compose 启动的容器,然后将 环境变量赋值过去的,这样在 npm run build的时候可以获取对应的变量。

二。Dockfile修改:只需要修改 WORKDIR 即可(此外,如果npmcache所在的目录发生变化,也需要改为正确的目录)

部署:
       同一个镜像,可以根据端口映射不同(即改变docker-compose.yml中的PORTS),来拉取不同的容器并启动。 这样就可以实现 域名/子路径 来访问对应的 服务了,不过要注意的是,COMPANY_NAME在docker-compose.yml中改掉之后,需要进入到容器内重新npm run build,否则会有问题。因为原始的镜像 build是固定的,不会动态改变。
       另外,注意docker-compose.yml所在的目录名称,不指定容器名称的话,会以父目录的名称拼接作为容器名,谨防 重名导致的不同容器 启动为一个容器服务。
       nginx 配置作为子路径就可以了,通过proxy_pass 反向代理就能访问到对应的端口服务,注意端口一定要对应。

posted @ 2022-06-19 15:07  Micheal_L  阅读(196)  评论(0编辑  收藏  举报