Tutorial: Mengotomatiskan build gambar kontainer saat gambar dasar diperbarui di registri kontainer pribadi lainnya

ACR Tasks mendukung build gambar otomatis saat gambar dasar kontainer diperbarui, seperti saat Anda menambal OS atau kerangka kerja aplikasi di salah satu gambar dasar Anda.

Dalam tutorial ini, Anda mempelajari cara membuat tugas ACR yang memicu build di cloud saat gambar dasar kontainer didorong ke registri kontainer Azure lainnya. Anda juga dapat mencoba tutorial untuk membuat tugas ACR yang memicu build gambar ketika gambar dasar didorong ke registri kontainer Azure yang sama.

Dalam tutorial ini:

  • Menyusun gambar dasar dalam registri dasar
  • Membuat tugas build aplikasi di registri lain untuk melacak gambar dasar
  • Perbarui gambar dasar untuk memicu tugas gambar aplikasi
  • Tampilkan tugas yang dipicu
  • Verifikasi gambar aplikasi yang diperbarui

Prasyarat

Selesaikan tutorial sebelumnya

Tutorial ini mengasumsikan Anda telah mengkonfigurasikan lingkungan Anda dan menyelesaikan langkah-langkah dalam dua tutorial pertama dalam seri, di mana Anda:

  • Membuat Azure Container Registry
  • Repositori sampel fork
  • Mengkloning sampel repositori
  • Membuuat token akses pribadi GitHub

Jika Anda belum melakukannya, selesaikan tutorial berikut sebelum melanjutkan:

Menyusun gambar kontainer di cloud dengan Tugas Azure Container Registry

Otomatiskan penyusunan gambar kontainer di cloud dengan Tugas Azure Container Registry

Selain registri kontainer yang dibuat untuk tutorial sebelumnya, Anda perlu membuat registri untuk menyimpan gambar dasar. Jika mau, buat registri kedua di lokasi yang berbeda dari registri asli.

Mengonfigurasi lingkungan

Isi variabel lingkungan shell ini dengan nilai yang sesuai untuk lingkungan Anda. Langkah ini tidak benar-benar diperlukan, tetapi membuat menjalankan perintah CLI Azure multibaris dalam tutorial ini sedikit lebih mudah. Jika tidak mengisi variabel lingkungan ini, Anda harus mengganti setiap nilai secara manual di mana pun variabel tersebut muncul dalam perintah contoh.

BASE_ACR=<base-registry-name>   # The name of your Azure container registry for base images
ACR_NAME=<registry-name>        # The name of your Azure container registry for application images
GIT_USER=<github-username>      # Your GitHub user account name
GIT_PAT=<personal-access-token> # The PAT you generated in the second tutorial

Skenario pembaruan gambar dasar

Tutorial ini memandu Anda melalui skenario pembaruan gambar dasar. Skenario ini mencerminkan alur kerja pengembangan untuk mengelola gambar dasar dalam registri kontainer pribadi umum saat membuat gambar aplikasi di registri lain. Gambar dasar dapat menentukan sistem operasi umum dan kerangka kerja yang digunakan oleh tim, atau bahkan komponen layanan umum.

Misalnya, pengembang yang mengembangkan gambar aplikasi dalam registri mereka sendiri dapat mengakses serangkaian gambar dasar yang dikelola dalam registri dasar umum. Registri dasar dapat berada di wilayah lain atau bahkan direplikasi secara geografis.

Sampel kode mencakup dua Dockerfiles: gambar aplikasi, dan gambar yang ditentukan sebagai basisnya. Di bagian berikut, Anda membuat tugas ACR yang secara otomatis memicu build gambar aplikasi saat versi baru gambar dasar didorong ke registri kontainer Azure yang berbeda.

  • Dockerfile-app: Aplikasi web Node.js kecil yang merender halaman web statis yang menampilkan versi Node.js yang mendasarinya. String versi disimulasikan: ini menampilkan konten variabel lingkungan, NODE_VERSION, yang didefinisikan dalam gambar dasar.

  • Dasar Dockerfile: Gambar yang Dockerfile-app menentukan sebagai dasarnya. Ini sendiri didasarkan pada gambar Simpul, dan termasuk variabel lingkungan NODE_VERSION.

Di bagian berikut, Anda membuat tugas, memperbarui nilai NODE_VERSION di Dockerfile gambar dasar, lalu menggunakan Tugas ACR untuk menyusun gambar dasar. Ketika tugas ACR mendorong gambar dasar baru ke registri Anda, ini secara otomatis memicu penyusunan gambar aplikasi. Secara opsional, Anda menjalankan gambar kontainer aplikasi secara lokal untuk melihat berbagai string versi dalam gambar yang dibuat.

Dalam tutorial ini, tugas ACR Anda menyusun dan mendorong gambar kontainer aplikasi yang ditentukan dalam Dockerfile. ACR Tasks juga dapat menjalankan tugas multi-langkah, menggunakan file YAML untuk menentukan langkah-langkah dalam membangun, mendorong, dan secara opsional menguji beberapa kontainer.

Menyusun gambar dasar

Mulai dengan menyusun gambar dasar dengan tugas cepat Tugas ACR, menggunakan az acr build. Seperti yang dibahas dalam tutorial pertama dalam rangkaiannya, proses ini tidak hanya menyusun gambar, tetapi mendorongnya ke registri kontainer Anda jika build berhasil. Dalam contoh ini, gambar didorong ke registri gambar dasar.

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

Membuat tugas untuk melacak gambar dasar privat

Selanjutnya, buat tugas di registri gambar aplikasi dengan az acr task create, yang mengaktifkan identitas terkelola. Identitas terkelola digunakan dalam langkah-langkah selanjutnya sehingga tugas mengautentikasi dengan registri gambar dasar.

Contoh ini menggunakan identitas yang ditetapkan sistem, tetapi Anda dapat membuat dan mengaktifkan identitas terkelola yang ditetapkan pengguna untuk skenario tertentu. Untuk detailnya, lihat Autentikasi lintas registri dalam tugas ACR menggunakan identitas yang dikelola Azure.

az acr task create \
    --registry $ACR_NAME \
    --name baseexample2 \
    --image helloworld:{{.Run.ID}} \
    --context https://github.com/$GIT_USER/acr-build-helloworld-node.git#main \
    --file Dockerfile-app \
    --git-access-token $GIT_PAT \
    --arg REGISTRY_NAME=$BASE_ACR.azurecr.io \
    --assign-identity

Tugas ini serupa dengan tugas yang dibuat di tutorial sebelumnya. Ini menginstruksikan Tugas ACR untuk memicu penyusunan gambar ketika komit didorong ke repositori yang ditentukan oleh --context. Meskipun Dockerfile digunakan untuk membangun gambar dalam tutorial sebelumnya menentukan gambar dasar publik (FROM node:15-alpine), Dockerfile dalam tugas ini, Dockerfile-app, menentukan gambar dasar dalam registri gambar dasar:

FROM ${REGISTRY_NAME}/baseimages/node:15-alpine

Konfigurasi ini memudahkan untuk mensimulasikan patch kerangka kerja di gambar dasar nanti dalam tutorial ini.

Memberikan izin pull identitas ke registri dasar

Untuk memberikan izin identitas terkelola tugas untuk menarik gambar dari registri gambar dasar, pertama-tama jalankand az acr task show untuk mendapatkan ID pokok layanan identitas. Kemudian jalankan az acr show untuk mendapatkan ID sumber daya dari registri dasar:

# Get service principal ID of the task
principalID=$(az acr task show --name baseexample2 --registry $ACR_NAME --query identity.principalId --output tsv) 

# Get resource ID of the base registry
baseregID=$(az acr show --name $BASE_ACR --query id --output tsv) 

Tetapkan izin pull identitas terkelola ke registri dengan menjalankan az role assignment create:

az role assignment create \
  --assignee $principalID \
  --scope $baseregID --role acrpull 

Tambahkan kredensial registri target ke tugas

Jalankan az acr task credential add untuk menambahkan kredensial ke tugas. Lewati parameter --use-identity [system] untuk menunjukkan bahwa identitas terkelola yang ditetapkan sistem tugas dapat mengakses kredensial.

az acr task credential add \
  --name baseexample2 \
  --registry $ACR_NAME \
  --login-server $BASE_ACR.azurecr.io \
  --use-identity [system] 

Menjalankan tugas secara manual

Gunakan az acr task run untuk memicu tugas secara manual dan menyusun gambar aplikasi. Langkah ini diperlukan agar tugas melacak ketergantungan gambar aplikasi pada gambar dasar.

az acr task run --registry $ACR_NAME --name baseexample2

Setelah tugas selesai, perhatikan Run ID (misalnya, "da6") jika Anda ingin menyelesaikan langkah opsional berikut.

Opsional: Jalankan kontainer aplikasi secara lokal

Jika Anda bekerja secara lokal (bukan di Cloud Shell), dan Anda telah menginstal Docker, jalankan kontainer untuk melihat aplikasi yang dirender di browser web sebelum Anda membangun kembali gambar dasarnya. Jika Anda menggunakan Cloud Shell, lewati bagian ini (Cloud Shell tidak mendukung az acr login atau docker run).

Pertama, otentikasi ke registri kontainer Anda dengan az acr login:

az acr login --name $ACR_NAME

Sekarang, jalankan kontainer secara lokal dengan docker run. Ganti <run-id> dengan ID Jalankan yang ditemukan di output dari langkah sebelumnya (misalnya, "da6"). Contoh ini menamai kontainer myapp dan menyertakan parameter --rm untuk menghapus kontainer saat Anda menghentikannya.

docker run -d -p 8080:80 --name myapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

Navigasi ke http://localhost:8080 di browser Anda, dan Anda akan melihat versi Node.js yang dirender di halaman web, serupa dengan yang berikut ini. Di langkah berikutnya, Anda menabrak versi dengan menambahkan "a" ke string versi.

Cuplikan layar aplikasi sampel di browser

Untuk menghentikan dan menghapus kontainer, jalankan perintah berikut:

docker stop myapp

Cantumkan build

Berikutnya, cantumkan tugas yang dijalankan agar Tugas ACR telah selesai untuk registri Anda menggunakan perintah az acr task list-runs:

az acr task list-runs --registry $ACR_NAME --output table

Jika Anda menyelesaikan tutorial sebelumnya (dan tidak menghapus registri), Anda akan melihat output yang serupa dengan yang berikut ini. Perhatikan jumlah tugas yang dijalankan, dan RUN ID terbaru, sehingga Anda dapat membandingkan output setelah memperbarui gambar dasar di bagian berikutnya.

az acr task list-runs --registry $ACR_NAME --output table
UN ID    TASK            PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

Memperbarui gambar dasar

Di sini Anda mensimulasikan patch kerangka kerja dalam gambar dasar. Edit basis Dockerfile, dan tambahkan "a" setelah nomor versi yang ditentukan dalam NODE_VERSION:

ENV NODE_VERSION 15.2.1a

Jalankan tugas cepat untuk menyusun gambar dasar yang dimodifikasi. Perhatikan Run ID dalam output.

az acr build --registry $BASE_ACR --image baseimages/node:15-alpine --file Dockerfile-base .

Setelah penyusunan selesai dan tugas ACR telah mendorong gambar dasar baru ke registri Anda, ini akan memicu penyusunan gambar aplikasi. Mungkin perlu beberapa saat agar tugas yang Anda buat sebelumnya dapat memicu build gambar aplikasi, karena harus mendeteksi gambar dasar yang baru disusun dan didorong.

Daftar build yang diperbarui

Sekarang setelah Anda memperbarui gambar dasar, cantumkan pengoperasian tugas Anda lagi agar dapat dibandingkan dengan daftar sebelumnya. Jika pada awalnya output tidak berbeda, jalankan perintah secara berkala untuk melihat pengoperasian tugas baru muncul dalam daftar.

az acr task list-runs --registry $ACR_NAME --output table

Outputnya mirip dengan yang berikut ini. TRIGGER untuk build yang terakhir dieksekusi harus berstatus "Pembaruan Gambar", yang menunjukkan bahwa tugas dimulai oleh tugas cepat Anda dari gambar dasar.

az acr task list-runs --registry $ACR_NAME --output table
         PLATFORM    STATUS     TRIGGER       STARTED               DURATION
--------  --------------  ----------  ---------  ------------  --------------------  ----------
ca13      baseexample2    linux       Succeeded  Image Update  2020-11-21T00:06:00Z  00:00:43
ca12      baseexample2    linux       Succeeded  Manual        2020-11-21T00:00:56Z  00:00:36
ca11      baseexample1    linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:34
ca10      taskhelloworld  linux       Succeeded  Image Update  2020-11-20T23:38:24Z  00:00:24
cay                       linux       Succeeded  Manual        2020-11-20T23:38:08Z  00:00:22
cax       baseexample1    linux       Succeeded  Manual        2020-11-20T23:33:12Z  00:00:30
caw       taskhelloworld  linux       Succeeded  Commit        2020-11-20T23:16:07Z  00:00:29

Jika Anda ingin melakukan langkah opsional berikut menjalankan kontainer yang baru disusun untuk melihat nomor versi yang diperbarui, perhatikan nilai RUN ID untuk build yang dipicu Pembaruan Gambar (dalam output sebelumnya, ini adalah "ca13").

Opsional: Jalankan gambar yang baru disusun

Jika Anda bekerja secara lokal (bukan di Cloud Shell), dan Anda telah menginstal Docker, jalankan gambar aplikasi baru setelah build selesai. Ganti <run-id> dengan RUN ID yang Anda peroleh di langkah sebelumnya. Jika Anda menggunakan Cloud Shell, lewati bagian ini (Cloud Shell tidak mendukung docker run).

docker run -d -p 8081:80 --name updatedapp --rm $ACR_NAME.azurecr.io/helloworld:<run-id>

Navigasikan ke http://localhost:8081 di browser Anda, dan Anda akan melihat versi nomor Node.js yang diperbarui (dengan "a") di halaman web:

Cuplikan layar aplikasi sampel yang diperbarui di browser

Hal yang perlu dicatat adalah Anda memperbarui gambar dasar dengan nomor versi baru, tetapi gambar aplikasi yang dibangun terakhir menampilkan versi baru. Tugas ACR mengambil perubahan Anda ke gambar dasar, dan menyusun kembali gambar aplikasi Anda secara otomatis.

Untuk menghentikan dan menghapus kontainer, jalankan perintah berikut:

docker stop updatedapp

Langkah berikutnya

Dalam tutorial ini, Anda belajar cara menggunakan tugas untuk secara otomatis memicu build gambar kontainer ketika gambar dasar dari gambar tersebut telah diperbarui. Sekarang, lanjutkan ke tutorial berikutnya untuk mempelajari cara memicu tugas pada jadwal yang ditentukan.