成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

聊聊如何通過docker-compose將node服務部署到多套環境中

如何通過docker-compose將node服務部署到多套環境?下面本篇文章就來給大家介紹一下Docker-compose多環境部署Node服務的方法,希望對大家有所幫助!

聊聊如何通過docker-compose將node服務部署到多套環境中

一般情況下,我們項目在開發完成之后,需要部署到多套環境,比如測試、沙箱、集成等等,那么如何通過docker-compose將node服務部署到多套環境呢?下面文章具體說下,有什么不對的地方歡迎大家評論。

本文中的項目用到的技術是Gitlab+Ansible+Docker自動化部署node服務(nest框架寫的),步驟如下:

  • 編寫docker-compose、docker-compose.prod.yml配置文件

  • 修改package.json

  • 遠程服務器上創建兩個目錄,拉取node服務倉庫,切換到不同分支,分別表示測試、線上node服務

  • .gitlab-ci.yml文件編寫

  • ansible.yml文件編寫

  • 遠程服務器node服務(測試/線上)目錄下執行如下命令,執行之后,通過docker ps -a查看容器是否正常啟動,如果是up狀態掛起,證明容器啟動成功了。docker logs -f 容器id查看容器日志

# 測試目錄 /opt/xxx/server-test/server docker-compose up -d  # 線上目錄 /opt/xxx/server-prod/server # -f表示指定具體文件,默認執行的是docker-compose.yml文件 docker-compose -f docker-compose.prod.yml up -d

具體步驟

  • 編寫docker-compose、docker-compose.prod.yml配置文件

# docker-compose.yml version: '3.0' services: # 服務列表   # 測試數據庫   mysql:     image: mysql     container_name: mysql_test     restart: always     environment:       - MYSQL_ROOT_PASSWORD=test_sql       - NODE_ENV=development     ports:       - 13306:3306     volumes:       - 服務器上對應目錄:/var/lib/mysql          # 測試node服務   server:  # node服務     container_name: server-test # 容器名稱     image: node:14.15.0     ports:  # 暴露的端口       - "7007:5088"     environment:        - NODE_ENV=development     volumes:       - .:/data     working_dir: /data     depends_on: # web服務依靠mysql要先等mysql啟動       - mysql     restart: on-failure:5 # 自動重啟,失敗的話重啟5次后停止     command: yarn start # 覆蓋容器啟動后默認執行的命令
# docker-compose.prod.yml version: '3.0' services: # 服務列表   # 線上數據庫   prod-mysql:     image: mysql     container_name: mysql_prod     restart: always     environment:       - MYSQL_ROOT_PASSWORD=prod_sql       - NODE_ENV=production     ports:       - 13307:3306     volumes:       - 服務器上對應目錄:/var/lib/mysql    # 線上node服務   prod-server:     container_name: server-prod     image: node:14.15.0     ports:       - "7077:5089"     environment:        - NODE_ENV=production     volumes:       - .:/data     working_dir: /data     depends_on:       - prod-mysql     restart: on-failure:5     command: yarn start:prod
  • package.json中做如下修改

# cross-env指定NODE_ENV為開發或線上環境 ... "scripts": {     ...     "build": "nest build",     "start": "yarn && cross-env  NODE_ENV=development nest start",     "start:prod": "yarn && yarn build && cross-env  NODE_ENV=production node dist/src/main",     ...   }, ...
  • 遠程服務器上創建兩個目錄,分別存放測試、線上node服務

# 測試(dev分支),git clone node服務地址,切換到dev分支 /opt/xxx/server-test/server  # 線上(master分支),git clone node服務地址,切換到master分支 /opt/xxx/server-prod/server
  • .gitlab-ci.yml文件編寫

# CI變量說明說明 - BRANCH、DEV_BRANCH是CI變量,分別對應master、dev分支 - DOCKER_CONTAINER、DEV_DOCKER_CONTAINER分別對應線上、測試啟動的docker容器 - ROOT_PATH、DEV_ROOT_PATH分別對應遠程服務器上線上、測試node服務存放路徑 - CI_PROJECT_NAME表示gitlab上倉庫名稱  stages:   - dev_deploy   - master_deploy  master_deploy:   stage: master_deploy   image: ansible鏡像地址   script:     - echo "${HOST}" ansible_ssh_user="${USER}" ansible_ssh_pass="${PASS}" ansible_ssh_host="${HOST}" > hosts     - echo ansible-playbook ansible.yaml -e hosts=${HOST} -i ./hosts     - ansible-playbook ansible.yaml -e "HOST=${HOST}  DEST_PATH=${ROOT_PATH}/${CI_PROJECT_NAME} DOCKER_CONTAINER_NAME=${DOCKER_CONTAINER} CUR_BRANCH=${BRANCH}" -i ./hosts     - rm -f hosts   only:     - master   tags:     - k8s  dev_deploy:   stage: dev_deploy   image: ansible鏡像地址   script:     - echo "${HOST}" ansible_ssh_user="${USER}" ansible_ssh_pass="${PASS}" ansible_ssh_host="${HOST}" > hosts     - echo ansible-playbook ansible.yaml -e hosts=${HOST} -i ./hosts     - ansible-playbook ansible.yaml -e "HOST=${HOST}  DEST_PATH=${DEV_ROOT_PATH}/${CI_PROJECT_NAME} DOCKER_CONTAINER_NAME=${DEV_DOCKER_CONTAINER} CUR_BRANCH=${DEV_BRANCH}" -i ./hosts     - rm -f hosts   only:     - dev   tags:     - k8s
  • ansible.yml文件編寫

# cd到node服務server目錄,切換分支,拉取最新代碼,docker容器重啟 - name: deploy   hosts: "{{ HOST }}"   become_user: root   become: yes   tasks: # 任務     - name: git checkout branch       command: git checkout "{{CUR_BRANCH}}"       args:         chdir: "{{ DEST_PATH }}"     - name: git pull       command: git pull       args:         chdir: "{{ DEST_PATH }}"     - name: docker restart container       command: docker restart "{{ DOCKER_CONTAINER_NAME }}"       args:         chdir: "{{ DEST_PATH }}"
  • 遠程服務器node服務(測試/線上)目錄下執行如下命令

# 測試目錄 /opt/xxx/server-test/server docker-compose up -d  # 線上目錄 /opt/xxx/server-prod/server docker-compose -f docker-compose.prod.yml up -d

啟動成功之后通過docker ps -a查看容器啟動情況,具體如下圖所示:

聊聊如何通過docker-compose將node服務部署到多套環境中

說明

  • 測試環境:本地dev分支代碼提交或其他分支合并到dev分支時,會通過itlab CI、Ansible自動化部署node服務到遠程服務器,在對應服務器遠程目錄下切換分支、拉取最新代碼、重啟對應的測試docker容器

  • 線上環境:本地master分支代碼提交或其他分支合并到master分支時,會通過itlab CI、Ansible自動化部署node服務到遠程服務器,在對應服務器遠程目錄下切換分支、拉取最新代碼、重啟對應的線上docker容器

遇到的問題

問題一:測試/線上遠程node服務目錄下沒有node_modules目錄和dist目錄,即沒有下圖這兩個文件同時遠程服務器器上查看docker容器日志報如下錯誤(這個問題排查了好久才解決

聊聊如何通過docker-compose將node服務部署到多套環境中

聊聊如何通過docker-compose將node服務部署到多套環境中

排查: 發現和正常啟動的node服務容器對比來看,沒有這兩個目錄(dist和node_modules),排查是不是docker-compose.yml中command執行命令有問題,即docker-compose.yml的command中yarn && yarn start是不是有問題,于是嘗試把yarn操作放在package.json中,結果好啦。

解決:

# 修改前 # docker-compose.yml version: '3.0' services:   ...   server:     ...     command: yarn && yarn start      # package.json "scripts": {     ...     "build": "nest build",     "start": "cross-env  NODE_ENV=development nest start",     "start:prod": "cross-env  NODE_ENV=production yarn build && node dist/src/main",     ...   },      # 修改后 # docker-compose.yml version: '3.0' services:   ...   server:     ...     command: yarn start      # package.json 方案一: "scripts": {     ...     "build": "nest build",     "start": "yarn && cross-env  NODE_ENV=development nest start",     "start:prod": "yarn && yarn build && cross-env  NODE_ENV=production node dist/src/main",     ...   },    方案二: "scripts": {     ...     "build": "nest build",     "start": "cross-env NODE_ENV=development nest start",     "prestart": "yarn",     "start:prod": "yarn build && cross-env  NODE_ENV=production node dist/src/main",     "prestart:prod": "yarn",     ... },

注意

  • cross-env的位置,放在可執行命令之前,在本項目中,放在最前面服務器上報cross-env not found, 放在最后面環境變量不生效,NODE_ENV顯示undefined

  • script中可執行命令注意執行順序,比如yarn && yarn build && cross-env NODE_ENV=production node dist/src/main

  • script中pre

問題2: 前端線上域名映射不生效,nginx配置文件映射線上域名之后,發現訪問線上域名時,發現頁面沒有生效

排查:將nginx測試配置文件和線上配置文件對比,發現文件內容除了域名和api代理,其余都是一樣,那到底是什么原因呢?最后發現竟然是線上nginx配置文件后綴名不對,寫的是xxx.confg,此處心里一萬個想打死自己

解決: 修改線上nginx配置文件為正確的后綴,即xxx.conf后綴

問題三:Gitlab CI執行異常,具體報錯信息大概是報/server目錄找不到

排查:在CI里面打印輸出CI變量以及拼接出來的目錄變量,查看是哪一步有問題,經排查發現都是正常的,唯一不同的一點是CI變量后面設置了環境變量

解決:嘗試把環境變量改為All default,結果好了,記住,不要隨意配置CI后面的環境變量,如果修改的話,對應的Gitlab里面也是對應需要映射的,環境變量位置如下圖所示:

聊聊如何通過docker-compose將node服務部署到多套環境中

master_deploy:   ...   script:     ...     - echo ${ROOT_PATH}     - echo ${CI_PROJECT_NAME}     - echo ${ROOT_PATH}/${CI_PROJECT_NAME}     - echo ${DOCKER_CONTAINER}     - echo ${BRANCH}     ...  ...

本文到這就結束了,后面還會有一篇文件,講全棧項目從開發到自動化部署整個過程(用到的技術棧是Vue + Nest + Typeorm + Mysql+ Gitlab CI + Ansible + Docker)。

推薦學習:《docker視頻教程》、《nodejs 教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
狠狠久久亚洲欧美专区| 饥渴人妻精油按摩无码专区| 狠狠躁天天躁男人| 亚洲午夜无码久久久久| √天堂中文WWW官网在线| 精品亚洲成A人片在线观看少妇 | 免费看国产曰批40分钟| 亚洲乱码av无码一区二区三区| 国产午夜三级一区二区三| 无码人妻精品一区二区三区蜜桃91 | 亚洲国产丝袜精品一区 | 国产精品第20页| 色综合天天天天综合狠狠爱| 大黑大巴大战欧洲美女图片| 日本伊人精品一区二区三区| 八戒八戒WWW资源网在线观看| 欧美熟妇呻吟猛交XX牲| 99久久综合狠狠综合久久| 男生听到女生喘气是什么心理现象 | 乖别添了快放进来我想要| 搡BBBB搡BBB搡五十| 大J8黑人W巨大888A片| 亚洲 欧美精品SUV| 国产亚洲欧洲网友拍| 一出一进一爽一粗一大视频免费的 | 亚洲人成网站18禁止无码| 成人精品一区二区三区在线观看| 日本MACBOOKPRO高清| 宝贝儿感受到它对你的爱了吗小说 | 欧美午夜成人精品| 国产精品特级毛片一区二区| 无人区码一码二码三码| 国产麻豆一精品一AV一免费软件 | 日韩人妻无码精品久久久不卡| 成人免费体验区120秒| 欧美老熟妇乱子伦视频| AAAA级少妇高潮大片在线观看 | 无码精品人成人片在线观看| 国产精品无码久久久久成人影院| 亚洲综合无码AV一区二区三区| 久久亚洲AV成人无码精品 | 亚洲精品无码高潮喷水在线| 久久精品国产久精国产| 永久免费的啪啪网站免费观看浪潮| 久久无码人妻丰满熟妇区毛片| 天堂BT种子在线最新版资源| 动漫人物桶动漫人物免费观看网站 | 国产精品亚洲日韩欧美色窝窝色欲 | 极品教师第二季免费观看| 亚洲伊人久久综合成人| 蜜桃Av噜噜一区二区三区网址 | 国产一二三四区中| 亚洲精品中文字幕久久久久| 欧美人与禽ZOZZO| 国产亚洲AV☆浪潮在线观看 | 亚洲中文字幕无码爆乳| 日产精品乱码卡一卡2卡三网站| 宝贝你夹得太紧了我都要断了| 亚洲AV无码国产精品色| 久久发布国产伦子伦精品| 中文乱码人妻系列一区二区| 黑人刚破完处就三P| 2018国产精华国产精品| 人人爽人人澡人人人妻、百度| 黑人巨大熟女高潮痉挛潮喷| VIDEOS日本多毛HD护士| 熟交XXXXⅩ欧美老妇妇牲| 国产亚洲精品线观看K频道| 99精品久久久久久久另类| 人妻三级日本香港三级极| 国产成人综合精品无码| 亚洲精品9999久久久久无码| 人妻中文字幕AV无码专区| 国产精品午夜小视频观看| 中文字幕日韩精品无码内射| 久久精品国产亚洲A∨麻豆| 被C哭着爬走又被拉回来挺进H| 亚洲精品成人网站在线播放| 日韩AV午夜在线观看| 久久婷婷人人澡人人爽人人喊 | 小婷又软又嫩又紧水又多| 久久97超碰色中文字幕蜜芽| 吃了继兄给我开的药我做的梦| 性色AV 一区二区三区| 欧美金发尤物大战黑人| 干了快生了的孕妇| 亚洲国产群交无码AV| 色久综合网精品一区二区| 久久五月精品中文字幕| 性欧美牲交XXXXX视频| 亚洲AV高清在线观看一区二区| 久久天天躁狠狠躁夜夜网站| 国产精品久久福利新婚之夜| AA丁香综合激情| 无码精品黑人一区二区三区| 欧美激欧美啪啪片SM| 精品国内在视频线2019| e无遮挡粉嫩小泬久久久久久久| 无码播放一区二区三区| 欧美熟妇呻吟猛交XX性| 久久69精品久久久久久HB| 国产成人无码一二三区视频| 亚洲乱码精品久久久久| 天堂VA在线高清一区| 韩国三级HD中文字幕叫床| 中文字幕一区二区三区精彩视频| 少妇高潮太爽了在线观看欧美| 久久99精品久久久久久9| 国产精品成人观看视频国产奇米| H无码动漫在线观看人| 亚洲AⅤ天堂AV天堂无码| 女人大胆张开荫道口∞| 国产精品美女久久久网站动漫| 尤物193在线人妻精品免费| 色一情一乱一伦一区二区三区| 男j插女p无遮挡100%| 国产精品亚洲VA在线| 草莓视频APP下载| 亚洲一线产区二线产区区别在| 无人区一码二码三码区别在哪 | 黑料不打烊隐藏入口GITHUB| 国产A三级久久精品| 色综合天天综合狠狠爱| 欧美精品亚洲精品日韩专区VA| 久久精品国产亚洲色欲蜜壂AV| 国产美女丝袜高潮白浆| 丰满乳乱亲伦小说| 越南少妇毛茸茸的大BBW| 我和亲妺妺乱的性视频| 妺妺窝人体色www免费看| 国产精品无码翘臀在线观看| 成人免费A级毛片无码片在线播放 成人免费A级毛片无码片2022 | 国产女主播喷水视频在线观看| 666西方大但人文艺术| 新妺妺窝人体色7777婷婷| 色欲色欲天天天WWW亚洲伊| 强CAO出水嗯啊高潮了H漫画| けんじゃたいむMANA原神| 亚洲欧美成人久久综合中文网| 五月丁香综合激情六月久久| 少妇久久久久久久久久| 日本久久久WWW成人免费毛片丨| 久久国产热这里只有精品| 国产一区二区精品久久| 国产精品国产三级国产专不| 高H日本视频一区| 成熟交BGMBGMBGM的价格| 宝贝把腿抬高点我让你更爽漫画| AV成人午夜无码一区二区| 中文字幕精品无码| 伊人久久精品久久亚洲一区| 亚洲日韩欧洲无码A∨夜夜| 亚洲国产成人精品女人久久久 | 亚洲 欧美 卡通 另类 小说| 玩弄秘书的奶又大又软| 熟女一区二区三区| 十八禁无码免费网站| 你看桌子上都是你流的| 两男一女两根同进去舒服吗 | 公侵犯人妻一区二区三区免费| 粗大的内捧猛烈进出视频嘿嘿视频 | 日本成熟少妇喷浆在线观看| 青青草无码伊人久久| 久久久久久A亚洲欧洲AⅤ | 亚洲国产精品无码成人片久久| 亚洲AV无码乱码忘忧草亚洲人| 亚洲AⅤ国产成人AV片妓女| 小妖精又紧又湿高潮H视频69| 无人区卡一卡二卡三乱码入口| 无码少妇一区二区| 性欧美丰满熟妇XXXX性| 亚洲AV成人一区二区三区在线观 | 美丽的小蜜桃伦理美国| 黑人人妻AV一区二区三| 国内少妇毛片视频| 国产SM残忍打屁股调教视频| 国产ww又大又粗又刺激孕妇| 曰本丰满成熟xxxx精品| 中文字幕一区日韩精品 | 一本大道无码日韩精品影视丶| 无码视频免费一区二三区| 无人区码一码二码高高| 亚洲 小说区 图片区 都市| 亚洲AV永久无码精品秋霞电影影院| 少妇精品揄拍高潮少妇| 天干夜天干天天爽自慰| 日本一本2017国产| 搡老女人P老熟妇老熟女| 天堂8在/线中文在线资源8| 无码中文字幕AⅤ精品影院| 亚洲AV高清一区二区三区| 亚洲精品国产AV现线| 一本久久A久久精品亚洲| 中文字幕AV无码免费久久| 99精产国品一二三产区区别电影| 亚洲AV永久中文无码精品| 天天综合天天爱天天做| 性欧美VIDEO高清| 亚洲乱码1卡2卡3乱码在线芒果| 伊人天天久大香线蕉AV色|