将 Docker 镜像推送到 GitLab Container Registry 的完整步骤

一、前提准备

  1. GitLab 项目:

    • 在 GitLab 上拥有一个项目,例如 your-group/your-project-name
    • 重要: 确保项目路径(尤其是项目名称部分)全部使用小写字母。例如,如果初始是 Your-Project,请在项目设置中将其路径修改为 your-project
    • 在项目中启用 Container Registry 功能 (通常默认启用)。可以在项目的 Settings -> Packages & Registries 中查看。
  2. GitLab Personal Access Token (PAT):

    • 登录 GitLab。
    • 进入用户设置 (右上角头像 -> Edit profile -> Access Tokens)。
    • 创建一个新的 Personal Access Token。
    • 关键权限 (Scopes): 授予该 PAT read_registrywrite_registry 权限。
    • 复制生成的 PAT 字符串并妥善保管,它只显示一次。
  3. 本地 Docker 环境:

    • 安装并运行 Docker Desktop 或 Docker Engine。
  4. 项目代码和 Dockerfile:

    • 你的应用程序代码(例如 Spring Boot 后端、Vue 前端)。
    • 为每个需要构建镜像的应用准备好 Dockerfile(例如 Dockerfile.backend, Dockerfile.frontend)。

二、配置项目 .env 文件

在你的项目(通常在 docker/ 目录下或项目根目录)创建一个 .env 文件,用于存储配置变量。核心内容如下:

# --- GitLab Container Registry 配置 ---
# 1. DOCKER_REGISTRY: GitLab Registry 的完整路径
#    格式: registry.gitlab.com/<你的组名>/<你的项目名全小写>
DOCKER_REGISTRY=registry.gitlab.com/your-group/your-project-name# 2. COMPOSE_PROJECT_NAME: 用于构成镜像名称的一部分 (可选, 但脚本中使用了)
#    例如 'xsgl', 最终镜像名会是 .../your-project-name/xsgl-backend
COMPOSE_PROJECT_NAME=myapp# 3. 镜像标签 (可选, 默认为 latest)
BACKEND_IMAGE_TAG=v1.0
FRONTEND_IMAGE_TAG=v1.0# --- GitLab 凭据 (用于脚本,如果选择硬编码或从 .env 加载) ---
# 警告: 直接在 .env 中存储 PAT 有安全风险,更好的方式是运行时输入或使用更安全的凭据管理
# 如果脚本设计为提示输入,则这两项可以省略
# GITLAB_USERNAME="你的GitLab用户名"
# GITLAB_PAT="你的GitLab_PAT字符串"# --- 其他应用相关配置 (例如数据库密码、API密钥等) ---
# MYSQL_ROOT_PASSWORD=your_strong_password
# ... 其他配置 ...

请将 registry.gitlab.com/your-group/your-project-name 替换为你的实际 GitLab Registry 路径,并确保项目名是小写的。

三、编写/修改构建和推送脚本 (build-push.sh)

这是一个 Bash 脚本,用于自动化构建应用、构建 Docker 镜像并将其推送到 GitLab Registry。

核心代码片段 (build-push.sh):

#!/bin/bash# ... (脚本头部,加载 .env 等,见之前脚本) ...# --- 定义镜像名称 --- #
# 使用 .env 中的 DOCKER_REGISTRY, COMPOSE_PROJECT_NAME, *_IMAGE_TAG
BACKEND_IMAGE_FULL_NAME="${DOCKER_REGISTRY}/${COMPOSE_PROJECT_NAME}-backend:${BACKEND_IMAGE_TAG:-latest}"
FRONTEND_IMAGE_FULL_NAME="${DOCKER_REGISTRY}/${COMPOSE_PROJECT_NAME}-frontend:${FRONTEND_IMAGE_TAG:-latest}"echo "将要构建并推送以下镜像:"
echo "  后端: $BACKEND_IMAGE_FULL_NAME"
echo "  前端: $FRONTEND_IMAGE_FULL_NAME"# --- 登录到 Docker Registry --- #
# 从 DOCKER_REGISTRY 变量中提取主机名 (registry.gitlab.com)
DOCKER_REGISTRY_HOST=$(echo "$DOCKER_REGISTRY" | awk -F/ '{print $1}') # 应为 registry.gitlab.comif [ -z "$DOCKER_REGISTRY_HOST" ]; thenecho "错误: 无法从 DOCKER_REGISTRY ($DOCKER_REGISTRY) 中提取主机名。"exit 1
fi# --- Docker 登录方式选择 ---
# 方式1: 运行时提示输入 (更安全)
# echo "--- GitLab Docker Registry 登录 ---"
# read -p "请输入您的 GitLab 用户名: " GITLAB_USERNAME
# read -s -p "请输入您的 GitLab Personal Access Token (具有 read_registry 和 write_registry 权限): " GITLAB_PAT
# echo ""# 方式2: 硬编码 (有安全风险,如之前讨论)
GITLAB_USERNAME="your-gitlab-username" # 替换为你的 GitLab 用户名
GITLAB_PAT="your-gitlab-pat-string"    # 替换为你的 PATif [ -z "$GITLAB_USERNAME" ] || [ -z "$GITLAB_PAT" ]; thenecho "错误: GitLab 用户名或 PAT 未提供/设置。"exit 1
fiecho "正在尝试登录到 $DOCKER_REGISTRY_HOST ..."
echo "$GITLAB_PAT" | docker login "$DOCKER_REGISTRY_HOST" -u "$GITLAB_USERNAME" --password-stdin
LOGIN_EXIT_CODE=$?
echo "Docker login 命令退出状态码: $LOGIN_EXIT_CODE"if [ $LOGIN_EXIT_CODE -ne 0 ]; thenecho "错误: Docker 登录到 $DOCKER_REGISTRY_HOST 失败 (退出码: $LOGIN_EXIT_CODE)。"# ... (添加详细的错误检查提示) ...exit 1
fi
echo "Docker 登录成功。"# --- 构建应用程序 (示例: 后端 Maven, 前端 npm) --- #
# echo "\n>>> 开始构建后端项目..."
# cd "$PROJECT_ROOT"
# ./mvnw.cmd clean package -Dmaven.test.skip=true -f pom.xml # 或 ./mvnw ...
# echo "后端项目构建完成。"# echo "\n>>> 开始构建前端项目..."
# cd "$PROJECT_ROOT/ruoyi-ui" # 假设前端项目在 ruoyi-ui
# npm install # 如果需要
# npm run build:prod # 或其他构建命令
# echo "前端项目构建完成。"
# cd "$PROJECT_ROOT"# --- 构建 Docker 镜像 --- #
echo "\n>>> 开始构建后端 Docker 镜像..."
docker build -t "$BACKEND_IMAGE_FULL_NAME" -f "$DOCKER_DIR/Dockerfile.backend" "$PROJECT_ROOT"echo "\n>>> 开始构建前端 Docker 镜像..."
docker build -t "$FRONTEND_IMAGE_FULL_NAME" -f "$DOCKER_DIR/Dockerfile.frontend" "$PROJECT_ROOT" # 假设前端 Dockerfile 和上下文echo "Docker 镜像构建完成。"# --- 推送 Docker 镜像 --- #
echo "\n>>> 开始推送后端镜像 $BACKEND_IMAGE_FULL_NAME ..."
docker push "$BACKEND_IMAGE_FULL_NAME"echo "\n>>> 开始推送前端镜像 $FRONTEND_IMAGE_FULL_NAME ..."
docker push "$FRONTEND_IMAGE_FULL_NAME"echo "\n>>> 镜像推送完成!"
# ... (脚本尾部) ...

关键点解释:

  • DOCKER_REGISTRY: 必须是 registry.gitlab.com/...
  • DOCKER_REGISTRY_HOST: 脚本应正确提取出 registry.gitlab.com 作为登录主机。
  • 登录方式: 使用 --password-stdin 配合 PAT,这是脚本化登录的推荐方式。避免将 PAT 直接作为 docker login 的密码参数(不安全)。
  • 镜像名称全小写: GitLab(和 Docker)要求仓库路径和镜像名称(除了标签)为全小写。BACKEND_IMAGE_FULL_NAMEFRONTEND_IMAGE_FULL_NAME 的构造必须符合此规则。
  • 构建步骤: 脚本中应包含实际编译/构建你的应用程序的命令(例如 mvn packagenpm run build),这些步骤在 docker build 之前执行,以确保 Dockerfile 能复制到最新的构建产物。

四、执行脚本

  1. 确保 .env 文件配置正确。
  2. 确保 build-push.sh 脚本具有执行权限 (chmod +x build-push.sh)。
  3. 在终端中运行脚本:./build-push.sh
  4. 如果脚本设计为提示输入凭据,则按提示输入 GitLab 用户名和 PAT。

五、验证

推送成功后,你可以:

  • 在 GitLab 项目的 Packages & Registries -> Container Registry 页面看到你推送的镜像。
  • 在其他机器或环境中使用 docker pull ${DOCKER_REGISTRY}/${COMPOSE_PROJECT_NAME}-backend:${BACKEND_IMAGE_TAG} 来拉取镜像(需要先 docker login registry.gitlab.com)。

六、Mermaid 流程图

开始
创建/配置 GitLab 项目
生成 GitLab PAT
配置本地.env 文件
编写/配置 build-push.sh脚本
执行 build-push.sh
脚本加载.env
脚本定义镜像全名
脚本提取 DOCKER_REGISTRY_HOST
脚本执行 docker login
登录成功?
脚本构建应用程序
脚本执行 docker build
脚本执行 docker push
推送成功?
错误:登录失败,退出
成功:镜像推送到GitLab Registry
错误:推送失败 (检查PAT权限/路径/网络),退出
结束

七、技术文档核心要点 (总结)

目标: 将本地构建的 Docker 镜像安全可靠地推送到 GitLab Container Registry。

  1. GitLab Registry 地址: 标准地址为 registry.gitlab.com。镜像的完整路径遵循 registry.gitlab.com/<group_name>/<project_name_lowercase>/<image_name>:<tag> 格式。
  2. 认证:
    • 使用 GitLab Personal Access Token (PAT)。
    • PAT 必须具有 read_registrywrite_registry 权限。
    • 在脚本中使用 docker login registry.gitlab.com -u <gitlab_username> --password-stdin,通过管道将 PAT 传递给 --password-stdin
  3. 命名规范:
    • GitLab 项目路径(尤其是在 Registry 中引用的部分)必须全小写
    • Docker 镜像名称(不含标签)也必须全小写。
  4. 脚本化:
    • 使用 .env 文件管理配置变量(如 DOCKER_REGISTRY, IMAGE_TAGS),将 .env 文件加入 .gitignore
    • Bash 脚本 (build-push.sh) 自动化以下流程:
      • 加载配置。
      • 执行 docker login
      • (可选但推荐) 构建应用程序(例如 mvn package, npm run build)。
      • 执行 docker build,使用正确的全名和标签为镜像打 Tag。
      • 执行 docker push 推送镜像。
      • 包含错误检查和清晰的日志输出。
  5. 关键命令片段:
    • .env 配置:
      DOCKER_REGISTRY=registry.gitlab.com/your-group/your-project-lowercase
      GITLAB_USERNAME="your_gitlab_username" # 或者脚本中提示输入
      # GITLAB_PAT="your_pat" # 更推荐脚本中提示输入或从安全位置读取
      
    • docker login (脚本中):
      echo "$GITLAB_PAT" | docker login "registry.gitlab.com" -u "$GITLAB_USERNAME" --password-stdin
      
    • docker build (脚本中):
      IMAGE_FULL_NAME="${DOCKER_REGISTRY}/myimage:${TAG}"
      docker build -t "$IMAGE_FULL_NAME" -f path/to/Dockerfile .
      
    • docker push (脚本中):
      docker push "$IMAGE_FULL_NAME"
      
  6. 常见问题与陷阱:
    • Registry 主机名错误: 使用 gitlab.com 而不是 registry.gitlab.com 进行登录/推送。
    • 大小写问题: GitLab 项目路径或镜像名中包含大写字母。
    • PAT 权限不足: PAT 未授予 write_registry 权限。
    • PAT 过期或无效
    • 非 TTY 环境下的交互式登录尝试: 应使用 --password-stdin
    • 网络/防火墙问题 阻止对 registry.gitlab.com 的访问。

这份文档应该能帮助你或其他开发者理解并成功配置 GitLab Registry 的推送流程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82378.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-HashMap基础与扩展学习总结

​面试官​&#xff1a; “HashMap 是 Java 中最常用的数据结构之一&#xff0c;你能说说它的底层实现吗&#xff1f;比如哈希冲突是怎么解决的&#xff1f;” ​你​&#xff08;结合源码与优化场景&#xff09;&#xff1a; “好的&#xff0c;HashMap 底层是数组链表/红黑…

嵌入式学习之系统编程(五)进程(2)

一、进程的退出 &#xff08;一&#xff09;僵尸进程与孤儿进程 &#xff08;二&#xff09;相关函数 1、exit函数 2、_exit函数 3、atexit函数 二、进程空间的回收&#xff08;相关函数&#xff09; 1、wait函数 2、waitpid函数 3、练习 4、exec族 5、system函数 一…

AI时代新词-Transformer架构:开启AI新时代的关键技术

一、什么是Transformer架构&#xff1f; Transformer架构 是一种基于自注意力机制&#xff08;Self-Attention Mechanism&#xff09;的深度学习模型架构&#xff0c;最初由Vaswani等人在2017年的论文《Attention Is All You Need》中提出。它主要用于处理序列数据&#xff08…

基于cornerstone3D的dicom影像浏览器 第二十三章 mpr预设窗值与vr preset

文章目录 前言一、mpr窗口预设窗值二、vr preset三、调用流程 前言 实现mpr窗口预设窗值&#xff0c;vr窗口预设配色 效果如下&#xff1a; 一、mpr窗口预设窗值 可参考 第十五章 预设窗值 逻辑一样的&#xff0c;把windowWidth, windowCenter值转换为voiRange值&#xff0c;…

shell之通配符及正则表达式

通配符与正则表达式 通配符&#xff08;Globbing&#xff09; 通配符是由 Shell 处理的特殊字符&#xff0c;用于路径或文件名匹配。当 Shell 在命令参数中遇到通配符时&#xff0c;会将其扩展为匹配的文件路径&#xff1b;若没有匹配项&#xff0c;则作为普通字符传递给命令…

继电保护与安全自动装置:电力系统安全的守护神

电力系统是现代社会赖以生存的基础设施&#xff0c;而继电保护和安全自动装置则是保障电力系统安全稳定运行的守护神。 它们默默无闻地工作着&#xff0c;在电力系统出现异常时&#xff0c;能够迅速准确地切除故障&#xff0c;防止事故扩大&#xff0c;保障电力供应。 那么&…

Flink流处理基础概论

文章目录 引言Flink基本概述传统数据架构的不足Dataflow中的几大基本概念Dataflow流式处理宏观流程数据并行和任务并行的区别Flink中几种数据传播策略Flink中事件的延迟和吞吐事件延迟事件的吞吐如何更好的理解事件的延迟和吞吐flink数据流的几种操作输入输出转换操作滚动聚合窗…

Tomcat 使用与配置全解

一、 Tomcat简介 Tomcat服务器是Apache的一个开源免费的Web容器。它实现了JavaEE平台下部分技术规范&#xff0c;属于轻量级应用服务器。 1. Tomcat版本 Tomcat版本 JDK版本 Servlet版本 JSP版本 10.0.X 8 and later 5.0 3.0 9.0.x 8 and later 4.0 2.3 8.0.x 7…

Unity3D仿星露谷物语开发52之菜单页面

1、目标 创建菜单页面&#xff0c;可通过Esc键开启或关闭。 当把鼠标悬停在上面时它会高亮&#xff0c;然后当点击按钮时标签页会被选择。 2、 创建PauseMenuCanvas &#xff08;1&#xff09;创建Canvas 在Hierarchy -> PersistentScene -> UI下创建新的Cavans命名为…

Spring Boot 调优的 12 个关键节点

数据库连接池调优&#xff1a;精准匹配系统资源 症状&#xff1a; 默认配置下&#xff0c;连接池资源使用不当&#xff0c;高并发时连接耗尽或排队。 常见误区&#xff1a; spring:datasource:hikari:maximum-pool-size: 1000 # 设置过大connection-timeout: 30000 # 设置…

前端流行框架Vue3教程:28. Vue应用

28. Vue应用 应用实例 每个 Vue 应用都是通过 createApp函数创建一个新的 应用实例 main.js import {createApp} from vue import App from ./App.vue// app:Vue的实例对象 // 在一个Vue项目中&#xff0c;有且只有一个Vue的实例对象 const app createApp(App)/* 根组件选项…

MongoDB 数据库迁移:完整指南与最佳实践

在现代数据驱动的应用中&#xff0c;数据库迁移是一项常见的任务&#xff0c;无论是升级 MongoDB 版本、更换服务器硬件&#xff0c;还是迁移到云环境&#xff08;如 MongoDB Atlas&#xff09;&#xff0c;都需要一个可靠的迁移策略。错误的迁移方式可能导致数据丢失、应用停机…

MQTT-Vue整合

Vue整合 依赖环境 nodejs 版本 > 18安装 element plus npm install element-plus安装 mqtt npm install mqtt初始化Vue项目 使用 vite 创建项目 执行命令 npm create vitelatest输入项目名称 vue-mqtt-demo MQTT连接 连接组件代码 components/MqttDemo.vue <script…

IP 地址反向解析(IP反查域名)原理与应用

一、IP 地址反向解析的原理与技术细节 IP 地址反向解析&#xff08;Reverse IP Lookup&#xff09;是一种将 IP 地址映射回其关联域名或主机名的网络技术&#xff0c;与常见的正向 DNS 解析&#xff08;将域名解析为 IP 地址&#xff09;形成互补。这一过程在网络安全研究、漏…

Mermaid 文件支持的图表

Mermaid 文件后缀支持多种类型的图表&#xff0c;包括但不限于&#xff1a; 流程图&#xff1a;用于描述流程和决策的图表&#xff0c;常用于业务流程的表示和分析。 时序图&#xff1a;用于描述事件发生的顺序和时序关系的图表&#xff0c;常用于系统交互和消息传递的分析。 …

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来!

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来! 自动驾驶技术正加速变革全球交通体系,它不仅是机器学习与计算机视觉的胜利,更是一场 高效通信架构的革命。自动驾驶汽车需要实时交换信息,比如: 传感器数据(雷达、激光雷达、摄像头)V2V(车与车通信)V2X(…

PDF处理控件Aspose.PDF教程:以编程方式合并PDF文档

合并 PDF 文档是常见的需求——无论您是整理报告、合并发票还是整合扫描页面。单一、统一的文件更易于在个人、学术或专业用途中共享、存储和管理。 本文将向您展示如何使用 Aspose.PDF在C#、Java 和 Python中以编程方式合并 PDf 文件。 Aspose.PDF最新版下载 为什么使用 As…

.gitignore 的基本用法

.gitignore 文件是 Git 版本控制系统中一个非常重要的配置文件&#xff0c;用于指定哪些文件或目录应该被 Git 忽略&#xff0c;不纳入版本控制。合理使用 .gitignore 可以避免将临时文件、编译产物、敏感信息等不必要的文件提交到代码仓库中。 1. .gitignore 的基本用法 &…

华为OD机试真题——分糖果(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

通过chrome插件自动生成博客评论,高效发外链

最近crazy cattle 3d这个词爆火&#xff0c;很多人都在做&#xff0c;竞争异常激烈&#xff0c;甚至可以说是惨不忍睹。 从最近的数据看&#xff0c;胜出的主要是crazycattle3d.com, crazycattle3d.io, crazy-cattle-3d.com这几个&#xff0c;流量最高的crazycattle3d.com已经…