无法将Docker镜像推送至GitLab容器镜像仓库(Monorepo场景)
Nx Monorepo Docker镜像推送GitLab容器仓库超时问题解决
问题描述
我有一个包含多个NestJS API的Nx Monorepo项目,尝试将其中一个API的Docker镜像推送到GitLab容器镜像仓库时,持续因疑似超时失败。
项目结构
monorepo --package.json --apps ----app-api ------Dockerfile
app-api的Dockerfile内容
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . EXPOSE 4002 CMD ["npm", "run", "start:app-api"]
本地构建命令(执行成功)
docker build -t registry.gitlab.com/<group>/<project>/app-api -f apps/app-api/Dockerfile .
推送命令及错误输出
执行推送命令:
docker push registry.gitlab.com/<group>/<project>/app-api
出现错误:
Using default tag: latest The push refers to repository [registry.gitlab.com/<group>/<project>/app-api] c4b377e26346: Pushing [==================================================>] 2.276GB/2.276GB a6ddf7465691: Layer already exists 971cfc403c58: Layer already exists 9c2c8f3cfe79: Layer already exists 3fecce352908: Layer already exists 1da03ac21ec8: Layer already exists 926b35a05f1d: Layer already exists d4fc045c9e3a: Layer already exists use of closed network connection
GitLab仓库镜像状态
该镜像没有任何标签。
与该镜像相关的最后一个标签最近已被移除。此空镜像及任何关联数据将作为常规垃圾回收流程的一部分被自动删除。如有疑问,请联系管理员。
解决方法
1. 优化镜像大小(核心解决思路)
当前镜像包含整个Monorepo内容,体积达2.276GB,推送时极易触发超时。改用多阶段构建,仅复制运行所需文件:
# 构建阶段:编译代码 FROM node:18-alpine AS builder WORKDIR /app # 仅复制构建必需的配置文件和目标API代码 COPY package*.json ./ COPY nx.json ./ COPY tsconfig.base.json ./ COPY apps/app-api/ ./apps/app-api/ COPY packages/ ./packages/ # 若项目有共享包则保留,否则删除 RUN npm ci RUN npm run build app-api # 运行阶段:仅保留生产依赖和编译后的代码 FROM node:18-alpine WORKDIR /app COPY --from=builder /app/package*.json ./ COPY --from=builder /app/dist/apps/app-api ./dist/apps/app-api # 仅安装生产依赖 RUN npm ci --only=production EXPOSE 4002 CMD ["node", "dist/apps/app-api/main.js"]
2. 调整Docker推送超时设置
修改Docker配置文件(Linux为/etc/docker/daemon.json,Windows/macOS在Docker Desktop的设置面板中),增加超时时间:
{ "timeout": 300, "max-concurrent-uploads": 1 }
修改后重启Docker服务生效。
3. 给镜像打明确标签后推送
避免使用默认的latest标签,指定具体版本标签推送:
# 给已构建的镜像打标签 docker tag registry.gitlab.com/<group>/<project>/app-api registry.gitlab.com/<group>/<project>/app-api:v1.0.0 # 推送带标签的镜像 docker push registry.gitlab.com/<group>/<project>/app-api:v1.0.0
4. 检查网络连通性
测试与GitLab镜像仓库的网络连接稳定性:
ping registry.gitlab.com curl -v https://registry.gitlab.com/v2/
若网络不稳定,尝试切换网络环境或调整防火墙规则。
内容的提问来源于stack exchange,提问作者Andres Paredes
相关产品推荐
相关产品推荐

