Menentukan pekerjaan kontainer (YAML)
Layanan Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019
Secara default, pekerjaan berjalan pada komputer host tempat agen diinstal. Ini nyaman dan biasanya cocok untuk proyek yang baru saja mulai mengadopsi Azure Pipelines. Seiring waktu, Anda mungkin menemukan bahwa Anda ingin kontrol lebih besar atas konteks tempat tugas Anda dijalankan. Alur YAML menawarkan pekerjaan kontainer untuk tingkat kontrol ini.
Pada agen Linux dan Windows, pekerjaan dapat dijalankan pada host atau dalam kontainer. (Di macOS dan Red Hat Enterprise Linux 6, pekerjaan kontainer tidak tersedia.) Kontainer menyediakan isolasi dari host dan memungkinkan Anda menyematkan versi alat dan dependensi tertentu. Pekerjaan host memerlukan lebih sedikit penyiapan awal dan infrastruktur untuk dipertahankan.
Kontainer menawarkan abstraksi ringan atas sistem operasi host. Anda dapat memilih versi sistem operasi, alat, dan dependensi yang tepat yang diperlukan build Anda. Saat Anda menentukan kontainer di alur Anda, agen akan terlebih dahulu mengambil dan memulai kontainer. Kemudian, setiap langkah pekerjaan akan berjalan di dalam kontainer. Anda tidak dapat memiliki kontainer berlapis. Kontainer tidak didukung saat agen sudah berjalan di dalam kontainer.
Jika Anda memerlukan kontrol terperinci pada tingkat langkah individual, target langkah memungkinkan Anda memilih kontainer atau host untuk setiap langkah.
Persyaratan
Kontainer berbasis Linux
Sistem Azure Pipelines memerlukan beberapa hal dalam kontainer berbasis Linux:
- Bash
- berbasis glibc
- Dapat menjalankan Node.js (yang disediakan agen)
- Tidak menentukan
ENTRYPOINT
USER
memiliki akses kegroupadd
dan perintah hak istimewa lainnya tanpasudo
Dan di host agen Anda:
- Pastikan Docker terinstal
- Agen harus memiliki izin untuk mengakses daemon Docker
Pastikan kontainer Anda memiliki masing-masing alat ini yang tersedia. Beberapa kontainer yang dilucuti tersedia di Docker Hub, terutama yang didasarkan pada Alpine Linux, tidak memenuhi persyaratan minimum ini. Kontainer dengan ENTRYPOINT
mungkin tidak berfungsi, karena Azure Pipelines akan docker create
menjadi kontainer yang menunggu dan docker exec
serangkaian perintah, yang mengharapkan kontainer selalu aktif dan berjalan.
Catatan
Untuk kontainer Linux berbasis Windows, Node.js harus diinstal sebelumnya.
Kontainer Windows
Azure Pipelines juga dapat menjalankan Kontainer Windows. Windows Server versi 1803 atau yang lebih tinggi diperlukan. Docker harus diinstal. Pastikan agen alur Anda memiliki izin untuk mengakses daemon Docker.
Kontainer Windows harus mendukung menjalankan Node.js. Kontainer Windows Nano Server dasar kehilangan dependensi yang diperlukan untuk menjalankan Simpul.
Agen yang dihosting
Hanya windows-2019
dan ubuntu-*
gambar mendukung kontainer yang sedang berjalan.
Gambar macOS tidak mendukung kontainer yang sedang berjalan.
Pekerjaan tunggal
Contoh sederhana:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Ini memberi tahu sistem untuk mengambil gambar yang ubuntu
ditandai 18.04
dari Docker Hub dan kemudian memulai kontainer. printenv
Ketika perintah berjalan, perintah akan terjadi di ubuntu:18.04
dalam kontainer.
Contoh Windows:
pool:
vmImage: 'windows-2019'
container: mcr.microsoft.com/windows/servercore:ltsc2019
steps:
- script: set
Catatan
Windows mengharuskan versi kernel host dan kontainer cocok.
Karena contoh ini menggunakan gambar Windows 2019, kita akan menggunakan 2019
tag untuk kontainer.
Beberapa pekerjaan
Kontainer juga berguna untuk menjalankan langkah yang sama dalam beberapa pekerjaan.
Dalam contoh berikut, langkah-langkah yang sama berjalan di beberapa versi Ubuntu Linux.
(Dan kita tidak perlu menyebutkan jobs
kata kunci, karena hanya ada 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
Titik akhir
Kontainer dapat dihosting pada registri selain registri Docker Hub publik. Untuk menghosting gambar di Azure Container Registry atau registri kontainer privat lainnya (termasuk registri Docker Hub privat), tambahkan koneksi layanan ke registri privat. Kemudian Anda dapat mereferensikannya dalam spesifikasi kontainer:
container:
image: registry:ubuntu1804
endpoint: private_dockerhub_connection
steps:
- script: echo hello
or
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
steps:
- script: echo hello
Registri kontainer lainnya juga dapat berfungsi. Amazon ECR saat ini tidak berfungsi, karena ada alat klien lain yang diperlukan untuk mengonversi info masuk AWS menjadi sesuatu yang dapat digunakan Docker untuk mengautentikasi.
Catatan
Build Red Hat Enterprise Linux 6 dari agen tidak akan menjalankan pekerjaan kontainer. Pilih rasa Linux lain, seperti Red Hat Enterprise Linux 7 atau lebih tinggi.
Opsi
Jika Anda perlu mengontrol startup kontainer, Anda dapat menentukan options
.
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Menjalankan docker create --help
akan memberi Anda daftar opsi yang dapat diteruskan ke pemanggilan Docker. Tidak semua opsi ini ditujukan untuk bekerja dengan Azure DevOps. Periksa terlebih dahulu untuk melihat apakah Anda dapat menggunakan properti kontainer untuk mencapai tujuan yang sama. Untuk informasi selengkapnya, lihat resources.containers.container
di skema YAML dan docker create
referensi perintah .
Definisi kontainer yang dapat digunakan kembali
Dalam contoh berikut, kontainer ditentukan di bagian sumber daya.
Setiap kontainer kemudian dirujuk kemudian, dengan merujuk pada alias yang ditetapkan.
(Di sini, kami secara eksplisit mencantumkan kata kunci untuk kejelasan jobs
.)
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
Kontainer berbasis non glibc
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 kami gunakan di cloud yang dihosting, biasanya glibc. Beberapa varian Linux menggunakan runtime C lainnya. Misalnya, Alpine Linux menggunakan musl.
Jika Anda ingin menggunakan kontainer berbasis non-glibc sebagai kontainer pekerjaan, Anda harus mengatur beberapa hal sendiri. Pertama, Anda harus menyediakan salinan Node.js Anda sendiri. Kedua, Anda harus menambahkan label ke gambar Anda yang memberi tahu agen tempat menemukan biner Node.js. Akhirnya, stok Alpine tidak datang dengan dependensi lain yang bergantung pada Azure Pipelines: bash, sudo, yang, dan groupadd.
Bawa Node.js Anda sendiri
Anda bertanggung jawab untuk menambahkan biner Node ke kontainer Anda.
Node 14 adalah pilihan yang aman.
Anda dapat memulai dari node:14-alpine
gambar.
Beri tahu agen tentang Node.js
Agen akan membaca label kontainer "com.azure.dev.pipelines.handler.node.path".
Jika label ini ada, label harus berupa jalur ke biner Node.js.
Misalnya, dalam gambar berdasarkan node:10-alpine
, tambahkan baris ini ke Dockerfile Anda:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Menambahkan persyaratan
Azure Pipelines mengasumsikan sistem berbasis Bash dengan paket administrasi umum yang diinstal.
Alpine Linux khususnya tidak dilengkapi dengan beberapa paket yang diperlukan.
bash
Menginstal , sudo
, dan shadow
akan mencakup kebutuhan dasar.
RUN apk add bash sudo shadow
Jika Anda bergantung pada tugas dalam kotak atau Marketplace apa pun, Anda juga harus menyediakan biner yang mereka butuhkan.
Contoh lengkap Dockerfile
FROM node:10-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" ]
Beberapa pekerjaan dengan kumpulan agen pada satu agen yang dihosting
Pekerjaan kontainer menggunakan agen host dasar Docker config.json untuk otorisasi registri gambar, yang keluar di akhir inisialisasi kontainer registri Docker. Gambar registri berikutnya yang menarik otorisasi mungkin ditolak untuk "autentikasi tidak sah" karena file Docker config.json yang terdaftar dalam sistem untuk autentikasi telah dicatat oleh salah satu pekerjaan kontainer lain yang berjalan secara paralel.
Solusinya adalah mengatur variabel DOCKER_CONFIG
lingkungan Docker yang khusus untuk setiap layanan kumpulan agen yang berjalan pada agen yang dihosting. DOCKER_CONFIG
Ekspor di setiap skrip runsvc.sh kumpulan agen:
#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk