12-bo‘lim
Docker obrazini qurish va registry'ga yuborish
Quvurda obraz qurish, GHCR ga yuborish, teglash qoidalari, qatlam keshi va ko'p platformali qurish.
Ushbu bo‘lim mundarijasi
Testlar yashil bo'ldi. Endi ilovani serverga olib borish kerak - buning eng ishonchli yo'li uni obrazga joylash. Bu bo'lim Docker darsligi ning asoslarini bilishni talab qiladi.
Mahalliy qurishdan boshlaymiz #
Oddiy Node ilovasi uchun Dockerfile:
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Qurish:
docker build -t salom-ci:1.0.0 .
#9 [5/5] COPY . .
#9 DONE 0.1s
#10 exporting to image
#10 exporting layers 0.4s done
#10 naming to docker.io/library/salom-ci:1.0.0 done
#10 DONE 0.8s
Natijani tekshiramiz:
docker images salom-ci --format "{{.Repository}}:{{.Tag}} {{.Size}}"
docker run --rm -d -p 3100:3000 --name salom-sinov salom-ci:1.0.0
curl -s http://localhost:3100/
salom-ci:1.0.0 235MB
Salom, CI/CD!
Mahalliy ishlagan bu ikki buyruqni endi quvurga ko'chiramiz.
GHCR - GitHub ning registry'si #
Obrazni saqlash uchun alohida xizmatga ro'yxatdan o'tish shart emas:
GitHub Container Registry (ghcr.io) repozitoriyning o'zi bilan keladi va
autentifikatsiya uchun tayyor GITHUB_TOKEN ishlatiladi.
name: Obraz
on:
push:
branches: [main]
jobs:
obraz:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Registry'ga kirish
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Qurish va yuborish
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:latest
packages: write - eng ko'p unutiladigan qatorUsiz quvur shunday xato beradi:
denied: installation not allowed to Create organization package
GITHUB_TOKEN ning huquqlari sukut bo'yicha cheklangan. Registry'ga
yozish uchun aynan shu ruxsat kerak.
Teglash - eng muhim qaror #
latest tegi qulay, lekin u hech narsani bildirmaydi: qaysi kod
ichida ekanini bilib bo'lmaydi va orqaga qaytarish imkonsiz.
docker/metadata-action teglarni o'zi hisoblaydi:
- name: Teglarni hisoblash
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha,format=short
type=ref,event=branch
type=semver,pattern={{version}}
type=raw,value=latest,enable={{is_default_branch}}
- name: Qurish va yuborish
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
| Teg turi | Natija | Qachon |
|---|---|---|
type=sha | sha-9f2c1ab | Har doim - aniq kodga bog'lanadi |
type=ref,event=branch | main | Tarmoq nomi bo'yicha |
type=semver | 1.4.2, 1.4, 1 | v1.4.2 tegi qo'yilganda |
type=raw,value=latest | latest | Faqat asosiy tarmoqda |
Qatlam keshi #
Har ishga tushirishda obrazni noldan qurish sekin. Buildx GitHub keshidan foydalana oladi:
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
| Sozlama | Ma'nosi |
|---|---|
cache-from: type=gha | GitHub keshidan qatlamlarni oladi |
cache-to: ...,mode=max | Barcha oraliq qatlamlarni saqlaydi |
mode=min (sukut) | Faqat yakuniy qatlamlarni saqlaydi |
Kesh faqat qatlam o'zgarmagan bo'lsa ishlaydi. Shuning uchun
Dockerfile da kam o'zgaradigan narsa yuqorida turishi kerak:
COPY package*.json ./ # kamdan-kam o'zgaradi
RUN npm ci --omit=dev # kesh shu yerda saqlanadi
COPY . . # har kommitda o'zgaradi
Agar COPY . . yuqorida bo'lsa, har bir kichik o'zgarish
bog'liqliklarni qaytadan o'rnatishga majbur qiladi - kesh butunlay
foydasiz bo'lib qoladi.
To'liq quvur: test, keyin obraz #
name: Test va obraz
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm test
obraz:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha,format=short
type=raw,value=latest,enable={{is_default_branch}}
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max
needs: test shu yerda asosiy himoya: testlar qizil bo'lsa, obraz umuman
qurilmaydi.
Ko'p platformali obraz #
Server ARM protsessorda bo'lsa (masalan, ba'zi arzon VPS lar), obraz ham ARM uchun kerak:
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
- uses: docker/build-push-action@v6
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
QEMU orqali ARM emulyatsiyasi bir necha barobar sekin ishlaydi. Agar ARM kerak bo'lmasa, uni yozmang.
Kerak bo'lsa, ikki yo'l bor:
| Yechim | Izoh |
|---|---|
| Faqat relizda | Kundalik kommitlarda amd64, teg qo'yilganda ikkalasi |
| ARM runner | GitHub ning ARM runner'lari emulyatsiyasiz ishlaydi |
Obrazni PR da sinash #
PR da obrazni qurish foydali - Dockerfile buzilgani darhol ko'rinadi.
Lekin uni registry'ga yuborish shart emas:
obraz-sinovi:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/build-push-action@v6
with:
context: .
push: false
load: true
tags: sinov:${{ github.sha }}
- name: Obraz ishga tushishini tekshirish
run: |
docker run --rm -d -p 3000:3000 --name sinov sinov:${{ github.sha }}
sleep 3
curl -sSf http://localhost:3000/ || exit 1
docker rm -f sinov
push: false bilan obraz faqat quriladi, load: true esa uni mahalliy
Docker'ga yuklaydi - shunda uni ishga tushirib sinash mumkin.
- Ilovangiz uchun
Dockerfileyozing va uni mahalliy quring. - Obrazni ishga tushirib,
curlbilan javob olganingizga ishonch hosil qiling. - Quvurga obraz qurish jobini qo'shing (hali yubormasdan).
permissions: packages: writesiz yuborishga urinib, xatoni o'qing.- Ruxsatni qo'shib, obrazni GHCR ga yuboring.
- Repozitoriyning
Packagesbo'limida obrazni toping. docker/metadata-actionbilan uchta teg hosil qiling: sha, latest, tarmoq nomi.cache-fromvacache-toqo'shib, ikkinchi qurish vaqtini solishtiring.DockerfiledaCOPY . .ni yuqoriga ko'chirib, keshning buzilishini kuzating.- PR uchun
push: falsebilan obrazni faqat sinaydigan job yozing.
Xulosa #
- Obraz qurish quvurda testlardan keyin turadi:
needs: test. - GHCR (
ghcr.io) repozitoriy bilan birga keladi vaGITHUB_TOKENbilan ishlaydi. - Registry'ga yozish uchun
permissions: packages: writeshart. latesttegi qaysi kod ichida ekanini bildirmaydi - serverda aniq teg ishlating.docker/metadata-actionteglarni kommit, tarmoq va versiya bo'yicha o'zi hisoblaydi.- Qatlam keshi uchun
cache-from: type=ghavacache-to: type=gha,mode=max. - Dockerfile tartibi keshdan muhimroq: kam o'zgaradigan qadamlar yuqorida tursin.
- Ko'p platformali qurish QEMU orqali sezilarli sekinlashadi - faqat kerak bo'lsa yoqing.
- PR da obrazni
push: falsebilan qurib sinash mumkin - registry ifloslanmaydi. load: trueobrazni mahalliy Docker'ga yuklaydi va uni ishga tushirish imkonini beradi.
Keyingi bo'limda versiyalash va reliz chiqarishni avtomatlashtiramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.