公眾號「架構成長指南」,專注于生產實踐、云原生、分布式系統(tǒng)、大數(shù)據技術分享。
前言
最近在寫K8s的相關系列文章,因為有涉及到鏡像構建,發(fā)現(xiàn)在Mac m1的Arm架構下構建的部分鏡像,沒法在X86架構下使用,不兼容。
嘗試網上介紹的各種方式,都已失敗告終,效果如下:
最終還是Github
的Actions
拯救了我,下面介紹一下Actions
用法,希望對你有幫助。
概述
GitHub Actions 是一種持續(xù)集成和持續(xù)交付 (CI/CD) 平臺,可用于自動執(zhí)行生成、測試和部署管道。 您可以創(chuàng)建工作流程來構建和測試存儲庫的每個拉取請求,或將合并的拉取請求部署到生產環(huán)境。
GitHub Actions 不僅僅是 DevOps,還允許您在存儲庫中發(fā)生其他事件時運行工作流程。 例如,您可以運行工作流程,以便在有人在您的存儲庫中創(chuàng)建新問題時自動添加相應的標簽。
GitHub 提供 Linux、Windows 和 macOS 虛擬機來運行工作流程,或者您可以在自己的數(shù)據中心或云基礎架構中托管自己的自托管運行器。
以上是GitHub的官方介紹,其實就是有一個類似于Jenkins
的pipeline
,支持手動或者代碼等方式觸發(fā),支持pipeline運行在 Linux、Windows 和 macOS等虛擬機中,下面是一個示意圖
GitHub的pipeline使用yaml進行維護,同時內置了很多現(xiàn)成的組件,拿來即用,下面就以具體的一個實例進行介紹,如何使用
我們將做什么?
我們會構建一個前端工程的docker鏡像,并推送此鏡像至DockerHub倉庫,同時在k8s中拉取并運行驗證
1. 創(chuàng)建一個前端項目
工程已經創(chuàng)建好,地址: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
按鈕,創(chuàng)建對應的變量。
例如,我要創(chuàng)建DOCKER_HUB_USERNAME
變量,值為root
,配置如下:
創(chuàng)建worfkflow文件
點擊Actions
Actions內置了很多模版,拿過來配置下即可,這里我們用Publish Docker Container
,選擇其他也行,最終改成以下下文件
#workflow名稱
name: ci
# 觸發(fā)條件
on:
#github頁面手動觸發(fā)
workflow_dispatch:
#打tag觸發(fā),必須是v開頭的
push:
tags:
- "v*.*"
#變量配置
env:
#鏡像名稱
IMAGE_NAME: frontend
#dockerHub倉庫名稱
DOCKER_REGISTRY: dweizhao
jobs:
build-image:
#運行的環(huán)境
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配置多平臺環(huán)境
- 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
以上文件創(chuàng)建完成,會在工程目錄下創(chuàng)建一個.github的目錄,保存有我們配置的文件
同時再次點擊Actions
按鈕會出現(xiàn),以下界面
這里的ci
就是配置的workflow的name
名稱
4. 鏡像構建并發(fā)布
我們測試兩種方式,分別如下:
手動觸發(fā)構建
根據箭頭表示,點擊run wofkflow
按鈕,執(zhí)行任務
點擊ci可以查看任務執(zhí)行詳情,可以看到任務執(zhí)行步驟以及對應狀態(tài)以及相關日志
以上結果表明,執(zhí)行成功,查看dockerhub鏡像倉庫,可以看到推送已經成功,由于是手動觸發(fā)獲取不到tag,所以構建了edge
tag的鏡像
創(chuàng)建tag觸發(fā)構建
創(chuàng)建了一個v1.0.0
自動觸發(fā)構建
可以鏡像倉庫在同一時間,構建了latest
和1.0.0
tag鏡像
5. 容器部署驗證
下面我們在k8s環(huán)境中拉取frontent
前端鏡像,驗證是否部署成功。
我們創(chuàng)建了frontenddeployment
,同時指定了鏡像為dweizhao/frontend:latest
可以看到鏡像啟動成功
文章來源:http://www.zghlxwxcb.cn/news/detail-747123.html
結論
如果你用的是mac的m系列芯片,可以嘗試使用Github Actions來構建你的鏡像,前提是你自己的個人項目,Github Actions功能很強大,如果感興趣可以繼續(xù)去研究。文章來源地址http://www.zghlxwxcb.cn/news/detail-747123.html
到了這里,關于最佳實踐-使用Github Actions來構建跨平臺容器鏡像的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!