Kapsayıcı işlerini tanımlama (YAML)
Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019
Varsayılan olarak işler, aracının yüklü olduğu konak makinede çalıştırıldı. Bu, daha yeni yeni benimseyen projeler için kullanışlı ve genellikle Azure Pipelines. Zaman içinde, görevlerinizin çalıştır olduğu bağlam üzerinde daha fazla denetime sahip olmak istediğinize bakabilirsiniz. YAML işlem hatları, bu denetim düzeyi için kapsayıcı işleri sağlar.
Linux ve Windows aracılarında, işler konakta veyakapsayıcıda çalışıyor olabilir. (macOS ve Red Hat Enterprise Linux 6'da kapsayıcı işleri kullanılamaz.) Kapsayıcılar konaktan yalıtım sağlar ve araçların ve bağımlılıkların belirli sürümlerini sabitlemeye olanak sağlar. Konak işlerinin bakımı için daha az ilk kurulum ve altyapı gerekir.
Kapsayıcılar, konak işletim sistemi üzerinde basit bir soyutlama sağlar. Derlemenizin gerektirdiği işletim sistemlerinin, araçların ve bağımlılıkların tam sürümlerini seçin. İşlem hattınıza bir kapsayıcı belirttiğinizde, aracı önce kapsayıcıyı getirir ve başlatır. Daha sonra işin her adımı kapsayıcının içinde çalıştıracak. İç içe geçmiş kapsayıcılar olamaz. Bir aracı zaten bir kapsayıcının içinde çalıştırıldıklarında kapsayıcılar desteklanmaz.
Tek tek adım düzeyinde ince denetime ihtiyacınız varsa, adım hedefleri her adım için kapsayıcı veya konak seçmenize olanak sağlar.
Gereksinimler
Linux tabanlı kapsayıcılar
Sistem Azure Pipelines Linux tabanlı kapsayıcılarda birkaç şey gerektirir:
- Bash
- glibc tabanlı
- Aracıyı Node.js (aracı tarafından sağlar) çalıştır
- Bir tanımlamaz
ENTRYPOINT USERerişimi olan vegroupaddolmayan diğer ayrıcalık komutlarısudo
Aracı ana çıtanız üzerinde:
- Docker'ın yüklü olduğundan emin olmak
- Aracı Docker daemon'larına erişim iznine sahip olmalı
Kapsayıcınıza bu araçların her biri kullanılabilir olduğundan emin olun. Özellikle Alpine Linux'a dayananlar olmak üzere Docker Hub bazı kapsayıcılar bu minimum gereksinimleri karşılamaz. kapsayıcısı bekleyen bir kapsayıcı Azure Pipelines ve kapsayıcının her zaman çalışır durumda olmasını bekleyen komutlar dizisine sahip ENTRYPOINTdocker createdocker exec kapsayıcılar çalışmayabilirsiniz.
Not
Bu Windows tabanlı Linux kapsayıcıları Node.js önceden yüklenmiş olması gerekir.
Windows Kapsayıcıları
Azure Pipelines kapsayıcılarını da Windows çalıştır. Windows Server sürüm 1803 veya daha yenisi gereklidir. Docker'ın yüklü olması gerekir. İşlem hattı aracınıza Docker daemon'a erişim izni olduğundan emin olun.
Kapsayıcının Windows çalıştırmayı desteklemesi Node.js. Temel Windows Nano Sunucu kapsayıcısı, Node çalıştırmak için gereken bağımlılıkları eksiktir.
Barındırılan aracılar
Yalnızca windows-2019 ve ubuntu-* görüntüleri kapsayıcıları çalıştırmayı destekler.
macOS görüntüsü kapsayıcıları çalıştırmayı desteklemez.
Tek iş
Basit bir örnek:
pool:
vmImage: 'ubuntu-18.04'
container: ubuntu:18.04
steps:
- script: printenv
Bu, sisteme Docker Hub ubuntu18.04ubuntu ve ardından kapsayıcıyı başlatmalarını söyler. Komut printenv çalıştır geldiğinde kapsayıcının içinde ubuntu:18.04 olur.
Aşağıdaki Windows örnek:
pool:
vmImage: 'windows-2019'
container: mcr.microsoft.com/windows/servercore:ltsc2019
steps:
- script: set
Not
Windows konak ve kapsayıcının çekirdek sürümünün eşleşmesi gerekir.
Bu örnekte Windows 2019 görüntüsü 2019'un kullanımına açık olduğu için 2019 kapsayıcı için etiketi kullanılır.
Birden çok iş
Kapsayıcılar aynı adımları birden çok iş içinde çalıştırmaya da yarar.
Aşağıdaki örnekte, aynı adımlar birden çok sürümde Ubuntu Linux.
(Yalnızca tek bir iş tanımlandığı jobs için anahtar sözcüğünden bahsetmemiz de gerek yok.)
pool:
vmImage: 'ubuntu-18.04'
strategy:
matrix:
ubuntu14:
containerImage: ubuntu:14.04
ubuntu16:
containerImage: ubuntu:16.04
ubuntu18:
containerImage: ubuntu:18.04
container: $[ variables['containerImage'] ]
steps:
- script: printenv
Uç Noktalar
Kapsayıcılar, kayıt defterleri dışında kayıt defterleri üzerinde Docker Hub. Bir görüntüyü bir Azure Container Registry veya başka bir özel kapsayıcı kayıt defterinde barındırmak için, özel kayıt defterine bir hizmet bağlantısı ekleyin. Ardından kapsayıcı özelliklerinde buna başvurabilirsiniz:
container:
image: registry:ubuntu1604
endpoint: private_dockerhub_connection
steps:
- script: echo hello
veya
container:
image: myprivate.azurecr.io/windowsservercore:1803
endpoint: my_acr_connection
steps:
- script: echo hello
Diğer kapsayıcı kayıt defterleri de çalışıyor olabilir. AWS kimlik bilgilerini Docker'ın kimlik doğrulaması için kullanabileceği bir şeye dönüştürmek için gereken ek istemci araçları mevcut olduğu için Amazon ECR şu anda çalışmıyor.
Not
Red Hat Enterprise Linux 6 derlemesi kapsayıcı işini çalıştırmaz. Red Hat Enterprise Linux 7 veya üzeri gibi başka bir Linux aroması seçin.
Seçenekler
Kapsayıcı başlatmayı denetlemeye ihtiyacınız varsa options belirtabilirsiniz.
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Çalıştırma, docker create --help desteklenen seçeneklerin listesini sağlar. komutuyla kullanılabilen herhangi bir seçeneği kullanabilirsiniz.
Yeniden kullanılabilir kapsayıcı tanımı
Aşağıdaki örnekte kapsayıcılar kaynaklar bölümünde tanımlanmıştır.
Her kapsayıcıya daha sonra, atanan diğer adı başvurarak başvurabilirsiniz.
(Burada netlik sağlamak için anahtar jobs sözcüğünü açıkça listelemiz.)
resources:
containers:
- container: u14
image: ubuntu:14.04
- container: u16
image: ubuntu:16.04
- container: u18
image: ubuntu:18.04
jobs:
- job: RunInContainer
pool:
vmImage: 'ubuntu-18.04'
strategy:
matrix:
ubuntu14:
containerResource: u14
ubuntu16:
containerResource: u16
ubuntu18:
containerResource: u18
container: $[ variables['containerResource'] ]
steps:
- script: printenv
Glibc tabanlı olmayan kapsayıcılar
Azure Pipelines aracısı, görevleri ve betikleri çalıştırmak Node.js bir kopyasını sağlar. Node.js sürümü, barındırılan bulutmizde kullanılan C çalışma zamanıyla (genellikle glibc) derlenmiş. Linux'ın bazı çeşitlemeleri diğer C çalışma zamanlarını kullanır. Örneğin Alpine Linux musl kullanır.
İş kapsayıcısı olarak glibc tabanlı olmayan bir kapsayıcı kullanmak için birkaç şeyi kendi başına düzenlemeniz gerekir. İlk olarak, kendi kaynak kopyanızı Node.js. İkinci olarak, aracıya ikili dosyanın bulunduğu yeri söyleyen bir etiket Node.js gerekir. Son olarak Stock Alpine, bağımlı olduğu diğer Azure Pipelines ile birlikte gelir: bash, sudo, which ve groupadd.
Kendi Node.js
Kapsayıcınıza Node ikili dosya eklemek sizin sorumluluğundadır.
Düğüm 14 güvenli bir seçimdir.
Görüntüden node:14-alpine başlayabilirsiniz.
Aracıya olay hakkında Node.js
Aracı " com.azure.dev.pipelines.handler.node.path" kapsayıcı etiketini okur.
Bu etiket varsa, ikili dosyanın yolu Node.js gerekir.
Örneğin, tabanlı bir görüntüde bu node:10-alpine satırı Dockerfile dosyanıza ekleyin:
LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"
Gereksinimler ekleme
Azure Pipelines, genel yönetim paketlerinin yüklü olduğu Bash tabanlı bir sistem olduğunu varsayıyor.
Alpine Linux özellikle gerekli paketlerden birkaçı ile birlikte gelir.
bash, ve sudoshadow yükleyerek temel ihtiyaçları karşılar.
RUN apk add bash sudo shadow
Herhangi bir in-box veya Market görevine bağlıysanız, bunların gerekli ikililerini de sağlamak gerekir.
Dockerfile'ın tam örneği
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" ]
Tek bir barındırılan aracıda aracı havuzlarına sahip birden çok iş
Kapsayıcı işi, görüntü kayıt defteri yetkilendirmesi için Docker config.json konak aracısını kullanır ve bu da Docker kayıt defteri kapsayıcı başlatmanın sonunda günlüğe depolanır. Kimlik doğrulama için sistemde kayıtlı Docker config. JSON dosyası, paralel olarak çalışan diğer kapsayıcı işlerden biri tarafından zaten oturum açtığından, sonraki kayıt defteri görüntüsü "yetkisiz kimlik doğrulaması" için yetkilendirme reddedilebilir.
Çözüm, DOCKER_CONFIG barındırılan aracıda çalışan her aracı havuzu hizmetine özgü Docker ortam değişkenini ayarlamaya yönelik olur. DOCKER_CONFIGHer aracı havuzunun runsvc.sh betiğine dışarı aktarın:
#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker