最佳实践-使用Github Actions来构建跨平台容器镜像
公眾號「架構成長指南」,專注于生產實踐、云原生、分布式系統、大數據技術分享。
前言
最近在寫K8s的相關系列文章,因為有涉及到鏡像構建,發現在Mac m1的Arm架構下構建的部分鏡像,沒法在X86架構下使用,不兼容。
嘗試網上介紹的各種方式,都已失敗告終,效果如下:
最終還是Github的Actions拯救了我,下面介紹一下Actions用法,希望對你有幫助。
概述
GitHub Actions 是一種持續集成和持續交付 (CI/CD) 平臺,可用于自動執行生成、測試和部署管道。 您可以創建工作流程來構建和測試存儲庫的每個拉取請求,或將合并的拉取請求部署到生產環境。
GitHub Actions 不僅僅是 DevOps,還允許您在存儲庫中發生其他事件時運行工作流程。 例如,您可以運行工作流程,以便在有人在您的存儲庫中創建新問題時自動添加相應的標簽。
GitHub 提供 Linux、Windows 和 macOS 虛擬機來運行工作流程,或者您可以在自己的數據中心或云基礎架構中托管自己的自托管運行器。
以上是GitHub的官方介紹,其實就是有一個類似于Jenkins的pipeline,支持手動或者代碼等方式觸發,支持pipeline運行在 Linux、Windows 和 macOS等虛擬機中,下面是一個示意圖
GitHub的pipeline使用yaml進行維護,同時內置了很多現成的組件,拿來即用,下面就以具體的一個實例進行介紹,如何使用
我們將做什么?
我們會構建一個前端工程的docker鏡像,并推送此鏡像至DockerHub倉庫,同時在k8s中拉取并運行驗證
1. 創建一個前端項目
工程已經創建好,地址:https://github.com/dongweizhao/frontend
其中為了方便部署,前端資源都存放在工程的dist目錄
2. 編寫Dockerfile
引用nginx鏡像,同時拷貝dist目錄下資源值容器的/frontend,同時拷貝nginx.conf覆蓋nginx鏡像默認的配置文件,以下文件工程中都已經涵蓋
nginx.conf
server{
listen 80;
server_name localhost;
root /frontend;
index index.html index.htm;
location /login {
try_files $uri $uri/ /login.html;
}
}
Dockerfile
from nginx
copy ./dist /frontend
run chown nginx.nginx /frontend -R
copy nginx.conf /etc/nginx/conf.d/default.conf
3. Actions配置
配置DockerHub賬號密碼
點擊New repository secret按鈕,創建對應的變量。
例如,我要創建DOCKER_HUB_USERNAME變量,值為root,配置如下:
創建worfkflow文件
點擊Actions
Actions內置了很多模版,拿過來配置下即可,這里我們用Publish Docker Container,選擇其他也行,最終改成以下下文件
#workflow名稱
name: ci
# 觸發條件
on:
#github頁面手動觸發
workflow_dispatch:
#打tag觸發,必須是v開頭的
push:
tags:
- "v*.*"
#變量配置
env:
#鏡像名稱
IMAGE_NAME: frontend
#dockerHub倉庫名稱
DOCKER_REGISTRY: dweizhao
jobs:
build-image:
#運行的環境
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai
outputs:
tags: ${{ steps.output-id.outputs.v }}
steps:
# 拉取代碼,同時獲取tag,如果獲取不到則默認值為edge,并賦值給v變量
- uses: actions/checkout@v3
- id: output-id
run: |
VERSION=edge
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/v}
fi
echo "v=${VERSION}" >> $GITHUB_OUTPUT
# Docker配置多平臺環境
- name: Set up Docker BuildX
uses: docker/setup-buildx-action@v2
# 登錄鏡像倉庫
- name: Login Docker Hub
uses: docker/login-action@v1
with:
#這里引用的變量為上一步配置的變量
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_PWD }}
# 打包構建并推送
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
platforms: |
linux/amd64
linux/arm64
#推送到鏡像倉庫
push: true
# 這里會構建兩個版本鏡像,
# 1.dweizhao/backend:latest
# 2. output-id步驟中獲取的v,構建dweizhao/backend:edge或者dweizhao/backend:對應tag值
tags: |
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.output-id.outputs.v }}
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
以上文件創建完成,會在工程目錄下創建一個.github的目錄,保存有我們配置的文件
同時再次點擊Actions按鈕會出現,以下界面
這里的ci就是配置的workflow的name名稱
4. 鏡像構建并發布
我們測試兩種方式,分別如下:
手動觸發構建
根據箭頭表示,點擊run wofkflow按鈕,執行任務
點擊ci可以查看任務執行詳情,可以看到任務執行步驟以及對應狀態以及相關日志
以上結果表明,執行成功,查看dockerhub鏡像倉庫,可以看到推送已經成功,由于是手動觸發獲取不到tag,所以構建了edgetag的鏡像
創建tag觸發構建
創建了一個v1.0.0
自動觸發構建
可以鏡像倉庫在同一時間,構建了latest和1.0.0tag鏡像
5. 容器部署驗證
下面我們在k8s環境中拉取frontent前端鏡像,驗證是否部署成功。
我們創建了frontenddeployment,同時指定了鏡像為dweizhao/frontend:latest
可以看到鏡像啟動成功
結論
如果你用的是mac的m系列芯片,可以嘗試使用Github Actions來構建你的鏡像,前提是你自己的個人項目,Github Actions功能很強大,如果感興趣可以繼續去研究。
總結
以上是生活随笔為你收集整理的最佳实践-使用Github Actions来构建跨平台容器镜像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神经网络入门篇:激活函数(Activat
- 下一篇: 五分钟k8s实战-Istio 网关