使用CI/CD部署服务器时遇Git与Docker错误,请求协助排查
问题排查与解决方案
一、Git Rebase 失败问题
原因
服务器上的 /mnt/tourmix-main 目录存在未提交的本地变更,Git 在执行 pull --rebase 时会阻止操作,避免本地变更被覆盖。
解决方案
根据实际需求选择以下一种方式:
- 暂存本地变更后拉取:
修改SSH脚本中的命令:cd /mnt/tourmix-main git stash git pull origin master --rebase git stash pop # 恢复暂存的变更,若有冲突需手动解决 - 丢弃本地变更(确认不需要时使用):
cd /mnt/tourmix-main git reset --hard HEAD git pull origin master --rebase - 自动暂存变更(Git 2.23+ 支持):
直接使用带自动暂存参数的拉取命令:git pull origin master --rebase --autostash
二、Docker 构建无法添加套接字文件问题
原因
Docker 构建时会将当前目录作为构建上下文打包成 tar 发送给守护进程,但 tar 格式不支持套接字文件(mysql.sock 是 MySQL 运行时生成的套接字)。你的 Dockerfile 中 COPY . . 会将项目根目录下的所有文件(包括 database/mysql.sock)纳入构建上下文,导致报错。
解决方案
- 添加
.dockerignore文件排除不必要的文件/目录:
在项目根目录创建.dockerignore文件,添加以下内容:
构建时会跳过database/ node_modules/ .git/database目录,避免包含套接字文件。 - 修正 Dockerfile 的复制逻辑:
不要使用COPY . .复制整个目录,而是只复制必要的文件,比如:# 替换原来的 COPY . . COPY package*.json ./ COPY next.config.js ./ COPY public/ ./public/ COPY src/ ./src/ COPY prisma/ ./prisma/ - 调整服务器目录结构:
将database目录移出项目根目录(比如放到/var/lib/mysql),因为运行时生成的套接字文件不需要纳入 Docker 镜像构建上下文。
额外注意事项
- Dockerfile 语法错误:
你的 Dockerfile 存在几处语法错误,会导致构建失败:- 第9行:
COPY -from-dependencies应改为COPY --from=dependencies - 第21行:
COPY -from-builder应改为COPY --from=builder - 镜像标签
node:1ts错误,应统一为node:lts
- 第9行:
- GitHub Workflow 冗余步骤:
workflow 中的actions/checkout@v3步骤冗余,因为你是通过 SSH 到服务器拉取代码,不需要在 GitHub runner 上检出代码,可直接删除该步骤。
内容的提问来源于stack exchange,提问作者Matteo Robert
相关产品推荐
相关产品推荐

