You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:13:44