用GitHub Actions制作Docker镜像
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
关于GitHub Actions
GitHub Actions 是 GitHub 的持续集成服务,执行持续集成所需的计算机资源是GitHub免费提供的,对一个Java程序员来说,他只要专心写代码然后提交到GitHub,提交后自动触发云端编译构建这个代码仓库,并生成各种持续集成结果,基本流程如下图:
众所周知,欣宸是个穷人,买不起好的电脑更租不起服务器,于是将本地java代码做成docker镜像的过程中会因为穷遇到各种问题,例如下载jar包慢、编译构建慢、上传docker镜像慢都是常态,如今有了GitHub Actions,效率提升了一大截,下图是一次云端构建的时间统计:
不提那些伤心事了,穷很难改变,习惯了就好,但是GitHub Actions还是要掌握的…
本篇文章由以下章节顺序组成:
- 介绍用于制作镜像的java项目
- 说明如何编写GitHub Actions的脚本文件
- 在GitHub上执行GitHub Actions
- 验证结果,看镜像是否构建成功,能不能正常使用
前提
为了确保GitHub上的项目可以顺利制作成镜像并推送到hub.docker.com,您需要做好以下准备:
- 可用的GitHub帐号;
- 可用的hub.docker.com帐号,也可以用其他镜像仓库如阿里云;
关于java项目
- 用于本次实战的项目,是个典型的父子结构的gradle工程,有一个模块是springboot工程,咱们今天要做的就是将此工程编译构建制作成docker镜像;
- 这个java工程的详细内容请参考《SpringBoot(2.4)应用制作Docker镜像(Gradle版官方方案)》,这里不再赘述,只挑出几个关键地方说一下;
- 如下图,demowebapp是个springboot应用,内部已经准备好了Dockerfile文件,只要用此文件即可将编译结果做成docker镜像:
- demowebapp项目内部有个controller类,提供web接口,用于验证功能是否正常;
设置环境变量
- 在推送镜像到hub.docker.com时,需要用到该网站的帐号和密码,这些信息自然不能写在GithHub仓库的代码中,如下图,在页面上按照下面红框的顺序新增两个secret类型的环境变量,稍后在GitHub Actions脚本中用变量名就能使用具体的帐号和密码了:
编写GitHub Actions脚本
- 这里我选择了在线编辑GitHub Actions脚本(您也可以在本地编辑后提交推送到GitHub),如下图红框,在Github项目页面上点击Actions:
- 如果该项目未曾添加过Actions脚本,您会看到一些脚本模板的推荐,如下图,选择红框中的Gradle模板:
- 如下图,此时出现在线编辑脚本的页面,可见GitHub已在线生成了一些脚本:
- 将脚本内容替换为以下内容,已添加了详细的注释,就不多赘述了,唯一要提醒的是镜像的TAG等于每次GitHub提交的commid:
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradlename: 构建docker镜像on:# main分支的push操作会触发当前脚本的执行push:branches: [ main ]# main分支的pr操作会触发当前脚本的执行pull_request:branches: [ main ]jobs:build:# 当前脚本是在容器中运行的,对应的镜像是ubuntu-latestruns-on: ubuntu-lateststeps:# 下载源码- uses: actions/checkout@v2- name: Set up JDK 1.8# 设置jdk环境uses: actions/setup-java@v1with:java-version: 1.8- name: Dump GitHub contextenv:GITHUB_CONTEXT: ${{ toJSON(github) }}# 将GTIHUB的信息都打印出来,后面的脚本可以使用这些信息,例如后面的镜像TAG用的就是这里面的commitidrun: echo "Hello ${{ github.event.commits[0].id }}"- name: Grant execute permission for gradlew# 给gradlew可执行权限run: chmod +x gradlew- name: Build with Gradle# 执行build命令run: ./gradlew build- name: Extract files from jar# 从构建好的jar中提取制作镜像所需的内容,例如依赖jar、class、配置文件等run: mkdir -p demowebapp/build/dependency && (cd demowebapp/build/dependency; jar -xf ../libs/*.jar)- name: Login docker hubenv:DOCKER_USERNAME: ${{secrets.DOCKER_USERNAME}}DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}# 指定login命令登录hub.docker.com,帐号和密码已经在GitHub网页中配置好了run: |echo "${DOCKER_PASSWORD}" | docker login --username ${DOCKER_USERNAME} --password-stdin- name: Set up Docker Buildx# 使用buildx来构建镜像,这个工具功能很丰富uses: crazy-max/ghaction-docker-buildx@v1with:buildx-version: latest- name: Build dockerfile (with push)# 构建镜像,用buildx可以同时构建X86和ARM架构的镜像,然后推送到hub.docker.comrun: |cd demowebapp && \fullCommit="${{ github.event.commits[0].id }}" && \docker buildx build \--platform=linux/amd64,linux/arm/v7,linux/arm64 \--output "type=image,push=true" \--file ./Dockerfile . \--tag bolingcavalry/demowebapp-docker:"${fullCommit: 0: 7}"
- 脚本写完后点击右上角的Start commit按钮,将脚本提交到GitHub上,此时页面上会提示正在构建:
- 点击上图红框,可以看到执行状态,如下图:
- 点击上图红框中的build,可以看到咱们写的actions脚本的执行详情,如下图:
- 正常情况下actions脚本可以执行成功,记下这次提交的id是ae465b4,登录hub.docker.com网站,可以见到新增的docker镜像已经就绪,tag就是ae465b4
Actions操作何时被触发?
前面咱们编写Actions脚本会触发构建操作,实际上您对这个仓库的任何内容的改动提交都会触发Actions脚本被执行,也就是说,之后您修改这个Java项目的代码后,只要一提交,hub.docker.com中就会有最新的镜像产生;
验证
- 接下来验证一下刚才构建的镜像是否可用
- 首先,掏出我最值钱的家当:树莓派3B(可想而知,欣宸有多么贫穷):
- 树莓派中有ARM架构的64位Linux操作系统,已经装好了docker,ssh登录后,执行以下命令拉取刚才建好的镜像:
docker pull bolingcavalry/demowebapp-docker:ae465b4
- 下载完毕后创建容器:
docker run --rm -p 8080:8080 bolingcavalry/demowebapp-docker:docker:ae465b4
- 控制台可见启动成功:
- 用浏览器访问,我这里树莓派的IP地址是192.168.50.150,因此URL是http://192.168.50.150:8080/hello,如下图,响应成功,镜像可以正常使用:
- 至此,用GitHub Actions制作Docker镜像的操作就全部完成了,希望能给您带来参考,大家一起体验白嫖微软服务器的快乐,才是真的快乐;
你不孤单,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界…
用GitHub Actions制作Docker镜像相关推荐
- 在jetson xavier nx上制作docker镜像
概览: 一.docker简介 二.在jetson xavier nx上制作docker镜像 一.docker简介 用途:对于一项工程,不同的机器都需要单独为其配置环境,且有时配环境是一件相当麻烦的事情 ...
- Java Spring Boot 2.0 实战之制作Docker镜像并推送到Docker Hub和阿里云仓库
内容摘要:大规模集群快速部署Java应用,需要制作Docker镜像,本次课程详细介绍如何制作Java程序的Docker镜像文件,深入解析DockerFile核心参数,以及实践演练把我们制作的Docke ...
- mysql sshd_制作Docker镜像之mysqlkeepalivedsshd
制作Docker镜像之mysql&keepalived&sshd mysql docker keepalived ssh 注:该实验采用的docker版本:Docker version ...
- 制作Docker镜像的两种方式
此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...
- 【记录】利用jar包制作docker镜像
[记录]利用jar包制作docker镜像 前提说明 创建构建docker文件 构建docker镜像 构建成功后启动容器 前提说明 jar包已上传linux服务器 jar包名称:demo.jar jar ...
- docker hub push_如何制作Docker镜像(image)?
制作Docker镜像一般有2种方法: 使用hub仓库中已有的环境,安装自己使用的软件环境后完成image创建 通过Dockerfile,完成镜像image的创建 下面通过展示具体操作方法: 第一种:使 ...
- 龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题
http://ask.loongnix.org/?/article/81 实验环境 本文的实验都是在龙芯3A3000机器上. 操作系统是loongnix(Fedora21)20170726版本, ...
- jar包制作Docker镜像
一.编写Dokcerfile ###FROM 指定该docker镜像运行环境(必须有此docker镜像,此处选择jdk:8) FROM ubuntu_java8:v1 ###将准备的配置文件添加到容器 ...
- 把代码和环境做成docker镜像_Jenkins把GitHub项目做成Docker镜像
本文是<Jenkins流水线(pipeline)实战>系列的第三篇,前面已对Jenkins流水线有了基本认识,也试过从GitHub下载pipeline脚本并执行,今天的实战是编写一段pip ...
最新文章
- vn.py 2.0.2 发布,全功能交易程序开发框架
- echarts饼图解析html标签,解决echarts中饼图标签重叠的问题
- docker 安装zookeeper集群
- How far away ?
- Yii的控制器等名称获取
- 在二元树中找出和为某一值的所有路径
- spring mvc tutorial
- 使用mimikatz抓取windows管理员密码
- idea实现远程调试
- null object java_java1.8--Null Object模式
- server: WebGame服务端架构分析
- hdu5294Tricks Device 最大流之最小割
- 解决报错:info There appears to be trouble with your network connection. Retrying...
- 世界上最著名的24句哲理
- 使用代码的当前SVN版本构建项目build版号
- 多线程加速图像模板匹配
- NR 物理资源(pointA,PRB,CRB之间关系)
- 网络安全培训出来为什么比较好找工作?
- 在WPS中提取出的照片在哪找_WPS会员签到领,不香吗?
- 全功能DB数据库管理工具,超赞,完全支持所有主流数据库