Open xu3cl40122 opened 3 years ago
猜測是受限記憶體大小之類的,目前沒辦法在 ec2 上面 build ,只好採用 local build => docker hub => ec2 pull 的流程。 要更新 docker -compose 內的 image version 難免會影響 compose 內其他 container,預計把 nginx 搬出來,以免被波及
雖然說 container 間可以透過 network 互相溝通,但是跨 compose file 還需要先建立 public network 之類的有點麻煩, 後來想說反正都會把 port export 到 host ,不如就用 host:xxxx port 連接比較簡單明瞭
在 windows, mac 上可以用 host.docker.internal
存取到 host 的 ip
在 linux 上有人說需要在 compose file 設定
extra_hosts:
- "host.docker.internal:host-gateway"
我自己測試是沒辦法,但是用 172.17.0.1
就可以莫名連的到
參考資料 https://stackoverflow.com/questions/48546124/what-is-linux-equivalent-of-host-docker-internal https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
nestjs 跑起來時好像沒有預設的環境變數,像是 NODE_ENV=PRODUCTION 之類的
必須自己加,目前是加在 package.json 的 script
"start:dev": "export NODE_ENV=development && nest start --watch "
如果是跑在 winodws 環境 export 可能要改成 SET
comment-service build 出來的 image 在 local 可以跑,丟到 ec2 上面卻說找不到 dist/main 之類的 懷疑是 Dockerfile 問題,先 copy gc-service 的 Dockerfile 來用(因為 gc-service 是會動的) 但包了好幾次還是不行(中間清快取 清環境 無限循環 ...)
後來懷疑是 window , linux 環境問題,用 wiindows 筆電 pull 下來發現也不能跑而且 image 裡面根本沒有 dist/ 所以其實 build 出來的 image 根本不能用,是因為開發環境有把當前資料夾 volume 進去才有 dist 可以執行
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
所以參考網路上教學改一下 Dockerfile https://dev.to/abbasogaji/how-to-dockerize-your-nestjs-app-for-production-2lmf
並在 production 不啟用 volume 就可以了
可以成功部署後該把流程寫成 script 流程大概是 local build image => push to docker hub => ec2 pull new image => docker-compose restart 原本以為可以直接這樣
docker build -t xu3cl40122/comment-service -f .\Dockerfile.prod .
docker push xu3cl40122/comment-service
ssh -i ec2
docker-compose -f docker-compose.prod.yml pull
docker-compose -f docker-compose.prod.yml up -d --remove-orphans
docker image prune -f
但是 ssh 到 ec2 指令就會中斷,目前解法是把要在 ec2 上執行的指令寫成 .sh 丟到 ec2 上,ssh 的時候直接指定該 script
# 在 local 的指令...
ssh ec2-user@ec2 sudo bash {path_of_script}
nginx 設定上傳檔案大小
到 /etc/nginx/nginx.conf
設定 client_max_body_size 20M;
ref https://www.cyberciti.biz/faq/linux-unix-bsd-nginx-413-request-entity-too-large/
開始寫 api spec,發現 nestjs 可以動態產生 spec ,其實也是要寫啦,就是在 controller 跟 dto 那邊加上一些 tag 這樣, 比較特別的部分應該是產生分頁的 response
開始寫測試,一開始卡在不知道如何 mock 依賴的東西,後來才看到要用 getRepositoryToken
來 mock Repository。
接著卡在不知道怎麼 catch throw 出來的 exception。
後來試出來怎麼測試丟出來的 exception 是不是預期的
await expect(() => gamesController.initGame(req, game_id))
.rejects.toEqual(new HttpException('only admin or host user can init game', HttpStatus.FORBIDDEN))
今天測試如何透過 typorm cli 來進行 db migration,因為在正式環境不適合開啟 ORM 的同步機制,有機率造成資料損毀。 本來想寫成 docker container 啟動時 cmd 執行 shell script 會自動 migration 的,但是卡關,目前還是需要手動 migration
typeorm.config
有一項 "migrationsRun": true,
可以設定,會在啟動 server 時執行指定資料夾內的 migration,
至於產生 migration 的部分把指令寫在 docker compose command 的 shell script 裡,
#之前好像是因為後面的參數用縮寫導致 cli 會再問一些問題使 script 沒有順順跑完,所以建議不要縮寫
npx typeorm migration:generate --name mg --outputJs
npm run start:prod
遇到神奇 bug deploy shelll script 突然不能跑了, 一開始先重開 asw ec2 => 沒用 後來發現是 shell script 裡面有空白字元
tr -d "\r" <./updateDocker.sh > updateDocker.sh
打算部署 comment-service 發現 build 出來的 docker image 竟然 1G 以上 ,需要縮減 image size
慎選 image base ex: node:14-alpine
npm install --production 實測會因為沒有裝到 nest 沒辦法
npm run build
可能要搭配其他設定