文章中的方法是自己琢磨出来的,或许有更优解,共同学习,共同进步!
docker-compose.yml 文件配置:
说明:【配置中有个别字段冗余,但不影响使用】该文件推荐放在nodejs项目的根目录中,gitee流水线中也用到了路径 ,如果修改,需要同步处理,避免异常情况
name: "node_server"services:node_server:image: node:20-alpine # 使用官方 Node.js 镜像(版本按需调整)container_name: node_serverports:- "8088:8088"volumes:- ./node:/usr/src/app # 挂载本地代码目录到容器- /usr/src/app/node_modules # 避免覆盖容器内的 node_modulesworking_dir: /usr/src/app # 设置容器内部的工作目录networks:- node_server_netdepends_on: # 确保依赖的容器先起来- node_mysql_dev- node_redisenvironment:- DB_HOST=node_mysql_dev # 使用服务名(Docker 网络内 DNS 自动解析)- DB_PORT=3306- DB_USER=root- DB_PASSWORD=PASSWORD- DB_NAME=node_test01 # 按需修改- npm_config_registry=https://registry.npmjs.org- TZ=Asia/Shanghairestart: unless-stoppedcommand: sh -c "npm install --legacy-peer-deps && npm start" # 启动命令node_mysql_dev:image: node_mysql # 你的自定义MySQL镜像,若用官方镜像可改为 `mysql:latest`container_name: node_mysql_devports:- "3306:3306"volumes:- ./mysql/conf.d:/etc/mysql/conf.d- ./mysql/data:/var/lib/mysql- ./mysql/mysql-files:/var/lib/mysql-files- ./mysql/init-scripts:/docker-entrypoint-initdb.d # sql文件位置networks:- node_server_netenvironment:- MYSQL_ROOT_PASSWORD=w43903- MYSQL_DATABASE:node_test01- TZ=Asia/Shanghai # 指定时区command:--character-set-server=utf8mb4--collation-server=utf8mb4_unicode_cirestart: unless-stoppedtty: true # 相当于 -itd 中的 -tnode_redis:image: redis:latest # 官方Redis镜像container_name: node_redisports:- "6379:6379"volumes:- ./redis/data:/data- ./redis/conf/redis.conf:/etc/redis/redis.confnetworks:- node_server_netenvironment:- TZ=Asia/Shanghaicommand: redis-server /etc/redis/redis.conf # 指定配置文件启动restart: unless-stopped# 自定义的网络
networks:node_server_net:
gitee流水线配置:
默认已有 服务器、仓库、及代码,并且远程仓库和本地已有关联
新建流水线操作可以查看另一篇文章:gitee_配置自动部署vue项目-CSDN博客
这篇文章只介绍【流水线的脚本配置、docker-compose.yml 文件的配置】
流水线配置:【#-控制台不会输出;echo-控制台输出】
# NodeJs构建echo '拉取最新代码'
git pull --rebase origin devlelopment # 分支名根据实际填写npm config set registry https://registry.npmmirror.com && npm install# nodejs 项目不用打包,下载依赖后在服务器运行即可,下面是将项目相关文件转为压缩包。压缩包名称要与后续步骤关联
tar -czf output.tar.gz node_modules src docker-compose.yml package.json server.jsecho '创建文件夹、移动压缩包、列举 dist 文件夹'
# 下游操作需要获取当前操作的 dist 产出物,类似于 vue 项目打包后的 dist 文件夹
mkdir -p dist && mv output.tar.gz ./dist/ && ls dist/
# 主机部署脚本# 宿主机中存放 nodejs 源码的位置
mkdir -p ~/docker/node_server/node# 清空,避免缓存
rm -rf ~/docker/node_server/node/*echo '解压内容'
# output.tar.gz 压缩包是上游的产出物,内部包含 dist 文件夹
tar zxvf ~/docker/node_server/gitee_go/deploy/output.tar.gz -C ~/docker/node_server/nodeecho '查看 ~/docker/node_server/node'
ls ~/docker/node_server/nodeecho '解压文件到指定路径'
# 这个 output.tar.gz 压缩包是上游操作中手动执行压缩的项目文件,内部包含 docker-compose.yml 文件
tar zxvf ~/docker/node_server/node/dist/output.tar.gz -C ~/docker/node_server/nodeecho '移动 docker-compose.yml 到~/docker/node_server 并查看'
mv ~/docker/node_server/node/docker-compose.yml ~/docker/node_server && ls ~/docker/node_server/echo '删除多余文件夹'
rm -rf ~/docker/node_server/node/dist ~/docker/node_server/gitee_go# 以上操作会进入内部文件夹,直接执行构建镜像操作会导致找不到配置文件
cd ~/docker/node_serverecho '移除容器、构建镜像并启动容器'
# 移除容器:如果不移除并直接执行打包的话,会导致镜像不更新
docker compose down && docker compose build && docker compose up -d
echo 'Hello Gitee Go!'
脚本执行完毕后,容器会根据依赖关系挨个启动,需要短暂时间更新状态
可以执行一下指令查看状态:
查看已经启动的容器
docker compose ps启动被停止的容器(重启容器)
docker compose start/restart [容器名]进入容器
docker compose exec 容器名 bash查看服务日志
docker compose logs [-f]
-f 代表输出实时日志用于停止和移除由 docker compose up 创建的容器、网络和卷
docker compose down