Pekerjaan kontainer dalam alur YAML
Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019
Artikel ini menjelaskan pekerjaan kontainer di Azure Pipelines.
Secara default, pekerjaan Azure Pipelines berjalan langsung di komputer host tempat agen diinstal. Pekerjaan agen yang dihosting nyaman, memerlukan sedikit pengaturan awal dan infrastruktur untuk dipertahankan, dan sangat cocok untuk proyek dasar.
Jika Anda ingin kontrol lebih atas konteks tugas, Anda dapat menentukan dan menjalankan pekerjaan dalam kontainer. Kontainer adalah abstraksi ringan atas sistem operasi host yang menyediakan isolasi dari host. Saat menjalankan pekerjaan dalam kontainer, Anda dapat memilih versi sistem operasi, alat, dan dependensi yang tepat yang diperlukan build Anda.
Agen Linux dan Windows dapat menjalankan pekerjaan alur langsung di host atau dalam kontainer. Pekerjaan kontainer tidak tersedia di macOS.
Untuk pekerjaan kontainer, agen terlebih dahulu mengambil dan memulai kontainer. Kemudian setiap langkah pekerjaan berjalan di dalam kontainer.
Jika Anda memerlukan kontrol terperinci pada tingkat langkah build individual, target langkah memungkinkan Anda memilih kontainer atau host untuk setiap langkah.
Prasyarat
- Gunakan alur YAML. Alur klasik tidak mendukung pekerjaan kontainer.
- Gunakan agen Windows atau Ubuntu yang dihosting. Hanya
windows-*
agen danubuntu-*
yang mendukung kontainer yang sedang berjalan. Agenmacos-*
tidak mendukung kontainer yang sedang berjalan. - Agen Anda disiapkan untuk pekerjaan kontainer.
- Agen Windows dan Linux harus menginstal Docker, dan memerlukan izin untuk mengakses daemon Docker.
- Kontainer tidak didukung saat agen sudah berjalan di dalam kontainer. Anda tidak dapat memiliki kontainer berlapis.
Persyaratan kontainer tambahan
Kontainer berbasis Linux memiliki persyaratan berikut. Untuk solusinya, lihat Kontainer berbasis Nonglibc.
- Bash terinstal
- Berbasis Pustaka C GNU (glibc)
- Tanpa
ENTRYPOINT
- Menyediakan
USER
akses kegroupadd
dan perintah istimewa lainnya tanpa menggunakansudo
- Dapat menjalankan Node.js, yang disediakan agen
Catatan
Node.js harus diinstal sebelumnya untuk kontainer Linux pada host Windows.
Beberapa kontainer yang dilucuti tersedia di Docker Hub, terutama kontainer berdasarkan Alpine Linux, tidak memenuhi persyaratan ini. Kontainer dengan ENTRYPOINT
mungkin tidak berfungsi karena Azure Pipelines docker create
dan docker exec
mengharapkan bahwa kontainer selalu aktif dan berjalan.
Contoh pekerjaan tunggal
Contoh berikut menentukan kontainer Windows atau Linux untuk satu pekerjaan.
Contoh sederhana berikut mendefinisikan kontainer Linux:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Contoh sebelumnya memberi tahu sistem untuk mengambil gambar yang ubuntu
ditandai 18.04
dari Docker Hub lalu memulai kontainer. Perintah printenv
berjalan di ubuntu:18.04
dalam kontainer.
Beberapa pekerjaan
Anda dapat menggunakan kontainer untuk menjalankan langkah yang sama dalam beberapa pekerjaan. Contoh berikut menjalankan langkah yang sama di beberapa versi Ubuntu Linux. Anda tidak perlu menyebutkan jobs
kata kunci karena hanya satu pekerjaan yang ditentukan.
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
ubuntu16:
containerImage: ubuntu:16.04
ubuntu18:
containerImage: ubuntu:18.04
ubuntu20:
containerImage: ubuntu:20.04
container: $[ variables['containerImage'] ]
steps:
- script: printenv
Beberapa pekerjaan dengan kumpulan agen pada satu host agen
Pekerjaan kontainer menggunakan file konfigurasi Docker agen host yang mendasar untuk otorisasi registri gambar. File ini keluar di akhir inisialisasi kontainer registri Docker. Penarikan gambar registri untuk pekerjaan kontainer berikutnya mungkin ditolak unauthorized authentication
karena pekerjaan lain yang berjalan secara paralel sudah keluar dari file konfigurasi Docker.
Solusinya adalah mengatur variabel DOCKER_CONFIG
lingkungan Docker yang khusus untuk setiap kumpulan agen yang berjalan pada agen yang dihosting. DOCKER_CONFIG
Ekspor di setiap skrip runsvc.sh kumpulan agen sebagai berikut:
export DOCKER_CONFIG=./.docker
Opsi startup
Anda dapat menentukan options
untuk mengontrol startup kontainer, seperti dalam contoh berikut:
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Menjalankan docker create --help
memberi Anda daftar opsi yang dapat Anda teruskan ke pemanggilan Docker. Tidak semua opsi ini dijamin berfungsi dengan Azure DevOps. Periksa terlebih dahulu untuk melihat apakah Anda dapat menggunakan container
properti untuk mencapai tujuan yang sama.
Untuk informasi selengkapnya, lihat referensi perintah buat docker dan definisi resources.containers.container dalam referensi skema YAML Azure DevOps.
Definisi kontainer yang dapat digunakan kembali
Contoh berikut mendefinisikan kontainer di bagian resources
, lalu mereferensikannya dengan alias yang ditetapkan. Kata jobs
kunci secara eksplisit tercantum untuk kejelasan.
resources:
containers:
- container: u16
image: ubuntu:16.04
- container: u18
image: ubuntu:18.04
- container: u20
image: ubuntu:20.04
jobs:
- job: RunInContainer
pool:
vmImage: 'ubuntu-latest'
strategy:
matrix:
ubuntu16:
containerResource: u16
ubuntu18:
containerResource: u18
ubuntu20:
containerResource: u20
container: $[ variables['containerResource'] ]
steps:
- script: printenv
Titik akhir layanan
Anda dapat menghosting kontainer di registri lain daripada Docker Hub publik. Untuk menghosting gambar di Azure Container Registry atau registri kontainer privat lainnya, termasuk registri Docker Hub privat, tambahkan koneksi layanan untuk mengakses registri. Kemudian Anda dapat mereferensikan titik akhir dalam definisi kontainer.
Koneksi Docker Hub Privat:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
Koneksi Azure Container Registry:
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
Catatan
Azure Pipelines tidak dapat menyiapkan koneksi layanan untuk Amazon Elastic Container Registry (ECR), karena Amazon ECR memerlukan alat klien lain untuk mengonversi kredensial AWS menjadi sesuatu yang dapat digunakan Docker untuk mengautentikasi.
Kontainer berbasis Nonglibc
Agen Azure Pipelines menyediakan salinan Node.js, yang diperlukan untuk menjalankan tugas dan skrip. Untuk mengetahui versi Node.js untuk agen yang dihosting, lihat Agen yang dihosting Microsoft.
Versi Node.js dikompilasi terhadap runtime C yang digunakan di cloud yang dihosting, biasanya glibc. Beberapa varian Linux menggunakan runtime C lainnya. Misalnya, Alpine Linux menggunakan musl.
Jika Anda ingin menggunakan kontainer berbasis nonglibc, Anda perlu:
- Berikan salinan Node.js Anda sendiri.
- Tambahkan label ke gambar Anda yang memberi tahu agen tempat menemukan biner Node.js.
- Berikan dependensi lain yang bergantung pada Azure Pipelines:
bash
, ,sudo
which
, dangroupadd
.
Menyediakan Node.js Anda sendiri
Jika Anda menggunakan kontainer berbasis nonglibc, Anda bertanggung jawab untuk menambahkan biner Node ke kontainer Anda. Node.js 18 adalah pilihan yang aman. Mulai dari node:18-alpine
gambar.
Beri tahu agen tentang Node.js
Agen membaca label "com.azure.dev.pipelines.handler.node.path"
kontainer . Jika label ini ada, label harus berupa jalur ke biner Node.js.
Misalnya, dalam gambar berdasarkan node:18-alpine
, tambahkan baris berikut ke Dockerfile Anda:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Menambahkan paket yang diperlukan
Azure Pipelines mengasumsikan sistem berbasis Bash dengan paket administratif umum yang diinstal. Alpine Linux khususnya tidak dilengkapi dengan beberapa paket yang diperlukan. Instal bash
, sudo
, dan shadow
untuk memenuhi kebutuhan dasar.
RUN apk add bash sudo shadow
Jika Anda bergantung pada tugas dalam kotak atau Marketplace, berikan juga biner yang mereka butuhkan.
Contoh Dockerfile Lengkap
FROM node:18-alpine
RUN apk add --no-cache --virtual .pipeline-deps readline linux-pam \
&& apk add bash sudo shadow \
&& apk del .pipeline-deps
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
CMD [ "node" ]