成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
性色AV一区二区三区天美传媒| 搡BBB搡BBBB搡BBBB| 日本肉体XXXX裸交| 四虎一区二区成人免费影院网址 | 又爽又黄无遮挡高潮视频网站 | 韩国免费A级毛片| 黑人干人三区亚洲| 久久亚洲色一区二区三区| 男生白内裤自慰GV白袜男同| 人妻少妇精品一区二区三区| 天天想你免费看西瓜视频| 亚洲AV无码乱码国产精品老妇| 亚洲同性男GV网站SEARCH| 91精品人妻人人做人碰人人爽| 成人免费区一区二区三区| 国产精品无码MV在线观看| 精品国产一区二区AV片| 免费无码又爽又刺激激情视频软件 | 亚洲中文精品久久久久久不卡| 97超级碰碰碰久久久久APP| 边做边爱完整版MP3在线下载| 国产精品高潮呻吟爱久久AV无码 | 五月丁香色综合久久4438| 日本精品一区二区三区试看| 无码中文人妻在线三区| 亚洲综合国产成人丁香五月激情| 蜜桃色欲AV久久无码精品软件| 亚洲国产成人综合在线不卡| 日本免码VA在线看免费最新 | 老熟妇高潮一区二区三区网| 人妻人人做人碰人人添 | 国内精品自产拍在线观看| 噜噜狠狠色综合久色AⅤ五区| 日产乱码一二三区别免费下| 亚洲国产AⅤ精品一区二区蜜桃| 95W乳液78WYW永久| 国产精品无码AV天天爽播放器| 老熟妇XXXⅩHD老熟女| 少妇人妻大乳在线视频不卡| 亚洲熟妇XXXXX色黄妇| 成年女人喷潮毛片免费播放| 教室抽插调教老师小说| 区二区三区在线 | 欧洲 | 久久99精品久久久久久清纯| 人人爽人人爽人人片AV免费| 亚洲国产精彩中文乱码AV| FREE性欧美HD另类精品| 国产在线看片无码人精品| 女人收缩时男人舒服吗| 五月婷日韩中文字幕| 696969大但人文艺术主题| 国产乱人伦精品一区二区| 亚洲AV无码精品色夜午夜网址 | 国产成人精品一区二区秒播 | 狠狠色噜噜狠狠狠狠色综合久| 久久综合无码中文字幕无码TS| 色老板在线影院播放| 亚洲色偷无码一区二区| 国产AV无码专区亚洲AⅤ| 没有被爱过的女人| 久久国产成人精品国产成人亚洲| 舌头伸进去里面吃小豆豆| 亚洲日韩欧美一区二区三区| 动物交配的全过程 | 午夜成人影片在线观看免费完整高| 亚洲一区二区三区乱码AⅤ蜜桃女| 护士猛少妇色ⅩⅩXXX猛叫| 人妻少妇乱子伦无码视频专区| 亚洲熟妇人妻系列| 国产旡码高清一区二区三区| 欧美成人在线最新| 亚洲区激情区无码区| 国产精品久久久久秋霞鲁丝| 青青草无码伊人久久| 影音先锋亚洲AV少妇熟女| 国产亚洲精品在AV| 色欲AV伊人久久大香线蕉影院| 18禁止导深夜福利备好纸巾| 精品国产免费第一区二区三区| 天堂AV无码AV一区二区三区| YY影院电视剧大全| 鲁死你AV资源站| 亚洲精品又大又粗| 国产精品亚洲LV粉色| 日韩精品东京热无码视频| 97在线 | 亚洲| 久久婷婷五月综合色国产香蕉 | 亚洲AV成人男人的天堂手机| 国产精品久久久久久久久岛 | 免费无码黄动漫在线观看| 太太其实你也很想要的对吧| 欧美熟妇精品一区二区三区| 亚洲国产精品久久久久秋霞影院 | 孩交乱子XXXX高清影视| 涩爱亚洲色欲AV无码成人专区| 中文有无人妻VS无码人妻激烈| 精品国产福利一区二区| 亚洲 欧洲 日韩 综合 第一页| 国产AV丝袜熟女AV一区| 日本欧美一区二区三区乱码| AV免费网站在线观看| 麻豆国产在线精品国偷产拍| 野花高清完整版免费观看视频电视| 狠狠久久精品中文字幕无码| 午夜AV内射一区二区三区红桃视 | 北方有佳人电视剧全集免费观看| 男女做高潮120秒试看| 夜夜高潮夜夜爽夜夜爱爱一区| 精品国产Ⅴ无码大片在线观看| 亚洲AV无码天堂一区二区三区| 国产麻豆剧传媒精品国产AV蜜桃| 少妇做爰免费视频网站| 短篇公交车高H肉辣全集目录| 日本XXXX少妇高清HD| 把舌头伸进她腿间花缝| 欧美最猛黑人XXXX黑人猛交98| 99久久免费国产精品四虎99久久精品免费看国产一区二区 | 久久AV无码AV高潮AV喷吹| 人交互MOUSE人害女生迈开腿| 久久亚洲AV无码精品色午夜| 婷婷色丁香伊人中文| 大胆GOGO高清在线观看| 免费无码黄动漫在线观看| 亚洲日韩中文字幕日本| 宝贝把腿开大让我添添电影| 老师你乖乖的可以让你少吃点苦头 | 影帝隔着内裤滑进去了H| 国产97色在线 | 免| 欧美最猛性XXXXX黑人巨| 亚洲色婷婷一区二区三区| 精品国产AⅤ一区天美传媒| 三级特黄60分钟在线播放2| 天天做天天爱夜夜爽毛片| 亚洲 欧洲 日韩 综合二区| 99久久久无码国产精品不卡| 交换朋友夫妻客厅互换4韩国| 熟妇高潮精品区一区二区三| FREE性台湾娇小VIDEOS| 麻豆国产一卡二卡三卡| 亚洲国产精品久久一线不卡| 国产A∨国片精品青草视频| 女性高爱潮AAAA级视频免费| 亚洲中文字幕精品久久久久久动漫| 国产无遮挡又黄又爽在线视频| 射精情感曰妓女色视频| JAPANESE国产永久| 欧美XXXX黑人又粗又大| 中文字幕精品一二三四五六七八| 黑人大群体交免费视频| 性少妇中国内射XXXX狠干| 久久精品国产亚洲AV麻豆小说| 亚洲乱码日产精品BD在线下载| 国产69成人精品视频免费| 老熟女另类XXX精品视频| 亚洲色播爱爱爱爱爱爱爱| 精品国产亚洲一区二区三区在线观| 97超级碰碰碰久久久久| 亚洲国产最大AV| 欧洲美女粗暴交视频| 亚洲人妻在线视频| 乱码中字在线观看一二区| CF穿越火线女去衣看奶| 少妇ⅩXXOOOZZXXHD| 日韩一区无码视频| 国产三级在线观看播放视频| A级毛片在线观看| 无人区码一码二码三码区别在哪里 | 日本免费一区二区三区| 免费天堂无码人妻成人AV电影| 久久精品成人免费国产片| 伊人久久精品无码麻豆一区| 欧美人与禽XOXO牲伦交| 国产AⅤ激情无码久久久无码| 性生交大片免费看淑女出招| 久久亚洲精品无码AV大香| 暗交小拗女一区二区三区三州| 天天躁夜夜躁天干天干2020| 精品人妻av无码一区二区三区| 88久久精品无码一区二区毛片| 三个男人换着躁我一| 黑人巨根后入娇小女孩| 82岁老人找20多岁小伙子| 婷婷亚洲综合五月天小说| 久久久久久AV无码免费网站下载| JAPANESE国产中文在线观| 羞羞午夜爽爽爽爱爱爱爱人人人| 无人区码一码二码三码区| 亚洲综合成人AⅤ在线观看| 人C交Z〇○Z〇○ⅩⅩ| 国产亚洲欧美精品一区| 坐公交车居然被弄了2个小时| 水蜜桃国产精品欧美日韩一区不卡| 精品久久久中文字幕人妻| 国产69精品久久久久777| 97精品伊人久久大香线蕉APP| 女人高潮抽搐30分钟| 国产精品国产三级国产普通话| 尤物YW午夜国产精品视频| 熟悉妇人妻av无码毛片| 久久亚洲国产精品成人AV秋霞|