【docker】使用github action来自动发布项目到dockerhub

news2024/12/24 8:32:33

本文首发于 ❄️慕雪的寒舍

使用github action来自动发布项目到dockerhub。参考 https://msdemt.github.io/p/github-action-build-docker/ 博客

1.准备工作

1.1 dockerhub token

https://hub.docker.com/settings/security

登录dockerhub,在用户的account settings里面获取用户token

image.png

将其添加到github仓库的secrets里面,具体位置是仓库设置中的 Secrets and variables 里面的 Actions 栏目中,如下图所示,添加 Repository secrets。

image.png

需要添加的是DOCKER_USERNAME为你的docker用户名(注意是用户名,不是邮箱),还有DOCKER_TOKEN为刚刚我们在dockerhub中获取的token。

1.2 获取github操作token

https://github.com/settings/tokens

到GitHub的用户设置中,创建一个token,需要给予repo、workflow、packages权限。如果你不知道给予什么权限,直接全给他选上,保障这个token不泄露给外部就可以了。

image.png

另外,expiration是过期日期,如果你担心泄漏造成问题,可以设置一个过期时间,但是需要到时间后去更新仓库的secrets。

image.png

点击确定以后会得到token,复制他,同样是到github仓库的secrets里面添加一个 RELEASE_TOKEN 变量。

2.上传workflows文件

2.1 添加如下yml文件

前期的准备工作已经搞定了,现在就是添加一个github action的yml文件了。

在你的仓库里面创建一个.github/workflows文件夹,并在里面创建一个.yml文件,写入如下内容。

name: docker images cicd
# 触发器设置
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

# 项目任务,任务之间可以并行调度
jobs:
  build:
  # 选择云端运行的环境
    runs-on: ubuntu-latest
    steps:
    # uses代表使用一个模块,此处使用的是checkout模块,将github项目文件导入到当前环境中
    - uses: actions/checkout@v3
    # 使用with跟在后面来为前面的模块输入参数
      with:
        submodules: 'true'
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v2
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
    # 这里用到了github的secrets功能,避免账户和密码随仓库泄露
       username: ${{ secrets.DOCKER_USERNAME }}
       password: ${{ secrets.DOCKER_TOKEN }}
    # 设置当前的发行版本tag
    - name: Release version
      id: release_version
      run: |
        app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp")
        echo "app_version=$app_version" >> $GITHUB_ENV
    # 开始构建镜像
    - name: Build and push
      uses: docker/build-push-action@v2
      with:
        context: .
        file: dockerfile
        build-args: |
          GITHUB_TOKEN=${{ secrets.RELEASE_TOKEN }}
        platforms: |
          linux/amd64
          linux/arm64
          linux/arm
        push: true
        # 指定用户/仓库名
        tags: |
          ${{ secrets.DOCKER_USERNAME }}/kook-ticket-bot:latest
          ${{ secrets.DOCKER_USERNAME }}/kook-ticket-bot:${{ env.app_version }}
    # 这里是通过md文件自动生成dockerhub描述的模块,也可以不需要
    - name: Docker Hub Description
      uses: peter-evans/dockerhub-description@v3
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        repository: ${{ secrets.DOCKER_USERNAME }}/kook-ticket-bot
        readme-filepath: ./README.md

对这里面的内容做一定说明,其中secrets.使用的就是我们刚刚添加到github仓库中的变量,分别用于访问github仓库和登录dockerhub。

你会发现最末尾通过readme文件自动生成dockerhub的描述部分,多出来了一个上文没有提到的secrets.DOCKER_PASSWORD,这个是你dockerhub账户的密码。如果你不需要自动生成dockerhub的描述,那就可以把最后一个Docker Hub Description条目直接删除了,否则需要添加这个secrets。

项目中我使用了version.py文件来存放最新的版本号,该文件需要在项目的根路径中创建,内容格式如下

APP_VERSION = '版本号'

使用这个workflows文件,你只需要修改${{ secrets.DOCKER_USERNAME }}/kook-ticket-bot里面右侧的镜像名字为你的项目名字,将file: dockerfile这里的dockerfile设置为你项目中dockerfile的文件路径就可以了。

另外,在这个yml中,指定了三个平台的docker镜像,这里可以根据你自己的实际需要来减少一些平台。毕竟大部分用户用的都是amd64(即x86)的电脑,如果没有用户需要使用arm平台,可以把后两项删除,以加快github action的运行速度。

        platforms: |
          linux/amd64
          linux/arm64
          linux/arm

最终完成action的截图如下

image.png

image.png

2.2 关于GITHUB_REPOSITORY_NAME_PART环境变量

在别的github action教学文章中,会提到使用${{ env.GITHUB_REPOSITORY_NAME_PART }}来直接用github的仓库名字作为镜像名。但经过我的测试,这个方法不适用于本文的这个workflows文件,使用该环境变量会导致容器的名字多出来一个尾随的/,最终的镜像名字变成了用户名/镜像名/:tag,不符合dockerhub中镜像的命名规范。以下是具体的actions执行错误截图。

image.png

The end

不过,根据github actions上的warning,我这个workflows文件已经是老版本的了,里面使用的很多特性都即将不再支持,所以只是个临时用用的权宜之计,后续得去找个另外的yaml文件来处理这个docker镜像了。

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

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

相关文章

【具体数学 Concrete Mathematics】1.1 递归问题 讲义

【具体数学 Concrete Mathematics】1.1 递归问题 导入 本节(1.1、1.1.1-1.1.3)主要围绕《具体数学》第一章 递归问题(Recurrent Problems)讲义部分的三个问题展开,分别是汉诺塔、平面上的直线以及约瑟夫问题。下面简单介绍一下递归问题和数学…

复数的处理

复数的处理 复数 V V V 定义为在 ( x , y ) (x,y) (x,y)-平面中实数对的有序集合。在这方面,复数可以被视为原点 ( 0 , 0 ) (0,0) (0,0) 上的向量。从这个角度看,复数的加法类似于 ( x , y ) (x,y) (x,y)-平面中向量的加法。 然而,乘法…

Vue3 国际化i18n语言库 网站多语言切换

介绍 在 Vue 3 项目中,国际化(i18n)是一个常见的需求,它允许你的应用支持多种语言,并根据用户的语言偏好显示相应的内容。为了实现国际化,你可以使用 vue-i18n 这个库,它是 Vue 官方推荐的国际…

vue常见**MS题 [2]

vue问题及理解 1、介绍一下vue2和vue3的区别 ‌Vue2和Vue3的主要区别体现在双向数据绑定原理、生命周期钩子函数、API、多根节点、性能和体积等方面。‌‌双向数据绑定原理‌:Vue2使用Object.defineProperty实现双向数据绑定,而Vue3则利用ES6的Proxy特性…

赚大钱和赚小钱,哪个更累?

最近一直在质疑我在做的项目,虽然有同行做到了很好的成绩,但是我还是质疑。 因为一直在赚小钱,接触到的也是新手、底层客户、墨迹客户。 越是钱少的生意,越不好做,客户越挑剔。 而且赚小钱会消磨人的心智。 前几年…

解决前端访问IIS服务器发生跨域请求报错的方法

现在WEB开发都是前后端分离的模式了,当前端代码访问后端WEB服务器时,经常会发生跨域请求报错的问题。   如果是IIS服务器,可以通过下面的方式轻松解决。   由于出现跨域问题是因为服务器返回的页面在返回头中没有设置“Access-Control-Al…

Servlet---Web会话跟踪 ▎token令牌

▍为什么要进行Web会话跟踪? http请求是无状态的,不携带用户信息的,当用户登录成功后,之后在于服务器交互时,服务器并不知道是哪个用户发送的请求 ▍Web会话跟踪 解决方法:在用户成功登录后,后端向前端响应token令牌(token令牌:用户信息),前端保存token令牌每次访问后端都先…

药店药品进销存管理系统药品出库药品入库药品销售-社区医院药品管理-基于JAVA+vue开发

2.2 业务流程分析 在进行业务流程分析时,需要按照原有信息流动过程,逐个地调查分析所有环节的处理业务、处理内容、处理顺序和对处理时间的要求,弄清各个环节需要的信息、信息来源、流经去向、处理方法、计算方法、提供信息的时间和信息形态…

Hadoop 中的大数据技术:Zookeeper安装 (2)

目录 下载地址 本地模式安装 1)安装前准备 2)配置修改 3)操作 Zookeeper 配置参数解读 Zookeeper 集群操作 集群规划 解压安装 配置服务器编号 配置 zoo.cfg 文件 集群操作 Zookeeper 集群启动停止脚本 创建脚本 增加脚本执行权限 …

EmguCV学习笔记 C# 6.1 边缘检测

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

【云原生】MySQL的源码编译

1、实验环境 (1)虚拟机版本:RHEL7.9 (2)主机 主机名称IP地址mysql-node1172.25.254.10mysql-node2172.25.254.20 2、实验步骤 注意:我们的两台主机都要进行MySQL源码编译,并且操作相同&…

二手物品交易boot代码

TOC springboot548二手物品交易boot代码--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可…

Leaflet+Leaflet-Geoman绘制天地图

安装所需依赖 yarn add leaflet geoman-io/leaflet-geoman-free文档地址 https://leafletjs.cn/ https://geoman.io/ <template><div id"map"></div><div class"handle"><button click"drawMap">绘制区块</b…

什么是生信分析?深入探讨生物信息学的技术、方法与广泛应用

介绍 生物信息学分析&#xff0c;简称生信分析&#xff0c;是一个结合了生物学、计算机科学、信息学和统计学的多学科领域&#xff0c;旨在处理、分析和解释海量的生物数据。随着现代生物技术的发展&#xff0c;尤其是高通量测序&#xff08;Next-Generation Sequencing, NGS&…

ArcGIS热点分析 (Getis-Ord Gi*)——七普地级市人口普查数据的热点与冷点分析

先了解什么是热点分析 ? 热点分析 (Getis-Ord Gi*) 是一种用于空间数据分析的技术&#xff0c;主要用于识别地理空间数据中值的聚集模式&#xff0c;可以帮助我们理解哪些区域存在高值或低值的聚集&#xff0c;这些聚集通常被称为“热点”或“冷点”&#xff0c;Gi* 统计量为…

LSI-9361阵列卡笔记

背景 要将raid0更改为JBOD直通模式 注意的点是要先将raid模式调整为JBOD之后重启机器&#xff0c;即可 备注&#xff1a;转换过程中硬盘中的数据未丢失。 步骤贴图 refer https://zhiliao.h3c.com/questions/dispcont/123250 https://blog.csdn.net/GreapFruit_J/article/…

Debian12安装jdk8环境

下载JDK8 下载页面&#xff1a;https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 笔者下载的是8u202&#xff1a; #wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz 解压安装 1、使用命令将压缩包复…

Golang | Leetcode Golang题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; func maxEnvelopes(envelopes [][]int) int {n : len(envelopes)if n 0 {return 0}sort.Slice(envelopes, func(i, j int) bool {a, b : envelopes[i], envelopes[j]return a[0] < b[0] || a[0] b[0] && a[1] > b[1]})f : …

旅游网站

TOC springboot281旅游网站 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业&#xff0…

【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口

雅达利&#xff08;Atari&#xff09;发布了Atari 7800游戏主机&#xff0c;目前这款主机在其官方商城接受预定&#xff0c;售价129.99美元。Atari 7800游戏主机&#xff0c;作为Atari 7800系列的革新升级版本&#xff0c;搭载了高效的Rockchip 3128处理器&#xff0c;不仅确保…