

踩坑React + Node.js/Express + Google Cloud Build + Docker前后端分离应用部署
source link: https://blog.skyju.cc/post/react-express-cloudbuild-docker/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.


踩坑React + Node.js/Express + Google Cloud Build + Docker前后端分离应用部署
这段时间完成了一个繁体-简体线上转换的小项目,采用react+express前后端分离开发。顺便学习了一下google cloud build和docker的相关应用。踩了些坑,在这里记录下。
Jul 16, 2021 By 居正这段时间完成了一个繁体-简体线上转换的小项目,采用react+express前后端分离开发。顺便学习了一下google cloud build和docker的相关应用。踩了些坑,在这里记录下。
前端使用create-react-app开发,采用axios请求后端的接口。
前端请求后端需要制定一个BASE_URL,由于最后是封装进docker镜像中,而一般来讲create-react-app由于使用webpack打包,BASE_URL需要在编译时就指定,不适合docker这种模式。所以这里需要一个能取到运行时环境变量的方法。
我采用的方法是前端加入一个config.json
放在public目录下,里面放置BASE_URL的值。前端程序每次启动先请求config得到后端真实地址再进行后续请求。然后在docker容器运行时覆写这个config,就能动态制定BASE_URL。
后来发现一个npm包能做到类似功能:runtime-env-cra
后端唯一需要动态指定的是服务运行的端口,这里用到dotenv这个npm包,这样环境变量可以在docker运行时指定,然后后端程序直接读取process.env.PORT
即可。
Docker镜像
前后端代码安装依赖的时候发现会从package-lock.json
(yarn.lock
)里读取我本地开发时候用的淘宝源安装,但这样在国外机器上构建镜像的时候就很慢。暂时的解决方法是在Dockerfile中删掉lock文件。
前端Dockerfile
前端镜像用分步构建,先用node:lts-alpine
这个镜像编译react app,然后把编译好的文件复制出来,用nginx:stable-alpine
作为http server。
记录一点,COPY指令如果前面那个参数是目录,会把目录里面的具体内容复制走,而不是把整个目录复制走。这点跟mv和cp都不一样。
还有一点,如果RUN里面有多个命令用&&
之类的符号连接,在最前面加个set -x ;
可以查看如果有报错到底是哪个命令出错了,方便调试。
文件:https://github.com/juzeon/tw-cn/blob/master/frontend/Dockerfile
前面说到的运行时写入config.json
的代码放在CMD指令里面。
后端Dockerfile
由于用到opencc库作为繁体-简体转换,而这个库里面核心代码是C写的,安装依赖时遇到node-gyp报错。刚开始还以为是alpine或者python的问题,换了几个镜像问题依旧。最后在构建中加入一行RUN apk add python make gcc g++
增加编译环境就解决了。
文件:https://github.com/juzeon/tw-cn/blob/master/backend/Dockerfile
Google Cloud Build
有几个坑:
- 如果在步骤中用到环境变量(或者SECRET),需要采用
entrypoint: 'bash'
格式。 - Secret Manager权限设置比较复杂,具体可以看这个文档:https://cloud.google.com/build/docs/interacting-with-dockerhub-images?hl=zh-cn。注意Secret Manager是收费的,$0.06/个/月。
- 构建触发器可以选择github上的项目。如果你用自建私有git仓库,需要在自己的服务器上安装谷歌提供的
gcloud
命令行工具,配置一下钩子。
另可参考文档:https://cloud.google.com/build/docs/configuring-builds/create-basic-configuration?hl=zh-cn
文件:https://github.com/juzeon/tw-cn/blob/master/cloudbuild.yaml
Cloud Build每天免费120分钟,还是很不错的。
docker-compose
docker容器编排,同一个网络中的容器和容器间交互是不需要用ports
做端口映射的,只有暴露给宿主机/公网的端口才需要。
这里的配置是前后端分别在容器中运行,另外再运行一个nginx镜像,将前后端组合起来,前端挂在/
下,后端挂在/backend
下,然后暴露18080端口(映射为nginx容器的80端口)给公网。
在volumes中挂载了一个nginx配置文件,覆写容器中默认的vhost。
文件:https://github.com/juzeon/tw-cn/blob/master/docker-compose.yml
nginx配置文件
其中把后端挂载/backend
目录的时候遇到URI方面的问题。查阅以下资料:
Nginx reverse proxy + URL rewrite
一文理清 nginx 中的 location 配置(系列一)
可以写成下面几种形式之一:
location ^~ /backend {
rewrite ^/backend/(.*)$ /$1 break;
proxy_pass http://backend:9999;
}
location ^~ /backend {
rewrite ^/backend(.*)$ $1 break;
proxy_pass http://backend:9999;
}
location ^~ /backend/ {
proxy_pass http://backend:9999/;
}
上面配置中的^~
都是可以去掉的,加上是为了保证优先级。
具体是什么原理,可以参考上面的链接的资料。
本来自己nginx都是乱配,通过这次把location、proxy相关的东西理解的更深刻了一点。
文件:https://github.com/juzeon/tw-cn/blob/master/nginx.conf
这次进行一次全栈开发+部署,还是有学到很多运维相关的知识。
Licensed under CC BY-NC-SA 4.0
Recommend
-
134
相信前后端分离这个词,早已流传甚广,大家一些自己的理解,但可能有些人的观点有稍许偏差:我们要搞 SPA,全AJAX,那才是前后端分离了。 什么是前后端分离 我们来聊聊什么是前后端分离。 先来看一张WEB系统前后端架构模型图。 WEB系统前后端架构模型 从图中可
-
233
浅谈前后端分离与实践 之 nodejs 中间层服务(二)书接上文,浅谈前后端分离与实践(一) 我们用mock服务器搭建起来了自己的前端数据模拟服务,前后端开发...
-
18
-
9
docker 部署前后端分离项目记录伊撒尔俺,只想跪在床上娇喘,不想隔着网线叫唤如题,最近...
-
3
ASP.NET Web 应用 Docker踩坑历程 听说Docker这玩意挺长时间了,新建Web应用的时候,也注意到有个启用Docker的选项。 前...
-
13
介绍本文用的经典的前后端分离开源项目、项目的拉取这些在另一篇博客!!! 其中所需要的前后端打包本篇就不做操作了!!不明白的去看另一篇博客!!! 地址:h...
-
15
前后端分离的 Web App 踩坑笔记 前后端分离的 Web App 踩坑笔记 2020-04-22 07:58:33 # Web 最近在做一个整整 10 学...
-
7
ShardingJdbc 怎么处理写完数据立即读的情况的呢? 我本地使用了两个库来做写库(ds_0_master)和读库(ds_0_salve),两个库并没有配置主从。 下面我就使用库里的 city 表做实验。主库的 city...
-
7
本文是基于Docker、Docker-compose、nginx、centos7、springboot进行前后端分离项目部署 关于Docker相关知识,可以查看文章:应用容器引擎-Docker Docke...
-
4
Vue+SpringBoot项目分离部署踩坑记录
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK