Kapsayıcı işlerini tanımlama (YAML)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Varsayılan olarak, işler aracının yüklü olduğu konak makinede çalışır. Bu kullanışlı bir özelliktir ve genellikle Azure Pipelines'ı benimsemeye yeni başlayan projeler için uygundur. Zaman içinde, görevlerinizin çalıştığı bağlam üzerinde daha fazla denetim sahibi olmak istediğinizi fark edebilirsiniz. YAML işlem hatları, bu denetim düzeyi için kapsayıcı işleri sunar.

Linux ve Windows aracılarında işler konakta veya kapsayıcıda çalıştırılabilir. (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 sabitlemenize olanak sağlar. Konak işlerinin sürdürülmesi için daha az ilk kurulum ve altyapı gerekir.

Kapsayıcılar, konak işletim sistemi üzerinde basit bir soyutlama sunar. Derlemenizin gerektirdiği işletim sistemlerinin, araçların ve bağımlılıkların tam sürümlerini seçebilirsiniz. İşlem hattınızda bir kapsayıcı belirttiğinizde aracı önce kapsayıcıyı getirir ve başlatır. Ardından, işin her adımı kapsayıcı içinde çalıştırılır. İç içe kapsayıcılara sahip olamazsınız. Kapsayıcılar, bir aracı zaten bir kapsayıcı içinde çalışırken desteklenmez.

Adım düzeyinde ayrıntılı denetime ihtiyacınız varsa, adım hedefleri her adım için kapsayıcı veya konak seçmenize olanak tanır.

Gereksinimler

Linux tabanlı kapsayıcılar

Azure Pipelines sistemi, Linux tabanlı kapsayıcılarda birkaç şey gerektirir:

  • Bash
  • glibc tabanlı
  • Node.js 'yi (aracının sağladığı) çalıştırabilir
  • Tanımlamaz ENTRYPOINT
  • USERgroupadd ve diğer ayrıcalık komutlarınasudo

Aracı ana bilgisayarınızda:

  • Docker'ın yüklü olduğundan emin olun
  • Aracının Docker daemon'a erişme izni olmalıdır

Kapsayıcınızda bu araçların her birinin kullanılabilir olduğundan emin olun. Docker Hub'da bulunan, özellikle Alpine Linux tabanlı kapsayıcıların bazıları bu minimum gereksinimleri karşılamaz. Azure Pipelines bekleyen bir kapsayıcı ve docker exec kapsayıcının her zaman çalışır durumda olmasını bekleyen bir dizi komut olacağından, kapsayıcısı olan ENTRYPOINT kapsayıcılar docker create çalışmayabilir.

Dekont

Windows tabanlı Linux kapsayıcıları için Node.js dosyasının önceden yüklenmiş olması gerekir.

Windows Kapsayıcıları

Azure Pipelines, Windows Kapsayıcıları da çalıştırabilir. Windows Server sürüm 1803 veya üzeri gereklidir. Docker yüklü olmalıdır. İşlem hatları aracınızın Docker daemon'a erişme izni olduğundan emin olun.

Windows kapsayıcısı Node.js'nin çalıştırılmasını desteklemelidir. Temel Bir Windows Nano Sunucu kapsayıcısı, Node'u çalıştırmak için gereken bağımlılıkları eksik.

Barındırılan aracılar

Yalnızca windows-2019 ve ubuntu-* görüntüleri kapsayıcı çalıştırmayı destekler. macOS görüntüsü kapsayıcı çalıştırmayı desteklemez.

Tek iş

Basit bir örnek:

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Bu, sisteme Docker Hub'dan etiketlenmiş 18.04 görüntüyü getirmesini ubuntu ve ardından kapsayıcıyı başlatmasını söyler. printenv Komut çalıştırıldığında kapsayıcının ubuntu:18.04 içinde gerçekleşir.

Bir Windows örneği:

pool:
  vmImage: 'windows-2019'

container: mcr.microsoft.com/windows/servercore:ltsc2019

steps:
- script: set

Dekont

Windows, konak ve kapsayıcının çekirdek sürümünün eşleşmesini gerektirir. Bu örnekte Windows 2019 görüntüsü kullanıldığı için kapsayıcının 2019 etiketini kullanacağız.

Birden çok iş

Kapsayıcılar aynı adımları birden çok işte çalıştırmak için de yararlıdır. Aşağıdaki örnekte, aynı adımlar Ubuntu Linux'un birden çok sürümünde çalıştırılır. (Yalnızca tek bir iş tanımlandığından anahtar sözcüğünden jobs bahsetmemiz gerekmez.)

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

Uç Noktalar

Kapsayıcılar genel Docker Hub kayıt defterleri dışındaki kayıt defterlerinde barındırılabilir. Azure Container Registry'de veya başka bir özel kapsayıcı kayıt defterinde (özel Docker Hub kayıt defteri dahil) bir görüntü barındırmak için, özel kayıt defterine bir hizmet bağlantısı ekleyin. Ardından kapsayıcı belirtiminde başvurabilirsiniz:

container:
  image: registry:ubuntu1804
  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ışabilir. AWS kimlik bilgilerini Docker'ın kimlik doğrulaması için kullanabileceği bir şeye dönüştürmek için gereken diğer istemci araçları olduğundan Amazon ECR şu anda çalışmıyor.

Dekont

Aracının 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 çeşidi seçin.

Seçenekler

Kapsayıcı başlatmayı denetlemeniz gerekiyorsa belirtebilirsiniz options.

container:
  image: ubuntu:18.04
  options: --hostname container-test --ip 192.168.0.1

steps:
- script: echo hello

Komutunu çalıştırdığınızda docker create --help Docker çağrısına geçirilebilen seçeneklerin listesi sunulur. Bu seçeneklerin tümü Azure DevOps ile çalışma garantisine sahip değildir. Aynı hedefe ulaşmak için bir kapsayıcı özelliği kullanıp kullanamadığını görmek için önce denetleyin. Daha fazla bilgi için YAML şemasınave komut başvurusuna docker create bakınresources.containers.container.

Yeniden kullanılabilir kapsayıcı tanımı

Aşağıdaki örnekte kapsayıcılar kaynaklar bölümünde tanımlanmıştır. Daha sonra her kapsayıcıya, atanan diğer adına başvurularak başvurulur. (Burada, netlik için anahtar sözcüğü açıkça listeleyeceğiz 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

Glibc tabanlı olmayan kapsayıcılar

Azure Pipelines aracısı, görevleri ve betikleri çalıştırmak için gereken Node.js dosyasının bir kopyasını sağlar. Barındırılan bir aracı için Node.js sürümünü öğrenmek için bkz . Microsoft tarafından barındırılan aracılar. Node.js sürümü genellikle glibc olan barındırılan bulutumuzda kullandığımız C çalışma zamanına göre derlenmektedir. Linux'un bazı varyantları diğer C çalışma zamanlarını kullanır. Örneğin Alpine Linux musl kullanır.

Glibc tabanlı olmayan bir kapsayıcıyı iş kapsayıcısı olarak kullanmak istiyorsanız, birkaç şeyi kendiniz düzenlemeniz gerekir. İlk olarak, kendi Node.js kopyanızı sağlamanız gerekir. İkincisi, aracıya Node.js ikili dosyasını nerede bulacağını söyleyen bir etiket eklemeniz gerekir. Son olarak, Alpine hisse senedi Azure Pipelines'ın bağımlı olduğu diğer bağımlılıklarla birlikte gelmez: bash, sudo, which ve groupadd.

Kendi Node.js'nizi getirin

Kapsayıcınıza bir Node ikili dosyası eklemek sizin sorumluluğunuzdadır. Düğüm 14 güvenli bir seçimdir. Görüntüden node:14-alpine başlayabilirsiniz.

Aracıya Node.js hakkında bilgi ver

Aracı , "com.azure.dev.pipelines.handler.node.path" kapsayıcı etiketini okur. Bu etiket varsa Node.js ikili dosyasının yolu olmalıdır. Örneğin, öğesini node:10-alpinetemel alan bir görüntüde bu satırı Dockerfile dosyanıza ekleyin:

LABEL "com.azure.dev.pipelines.agent.handler.node.path"="/usr/local/bin/node"

Gereksinimleri ekleme

Azure Pipelines, yaygın yönetim paketlerinin yüklü olduğu Bash tabanlı bir sistem olduğunu varsayar. Alpine Linux özellikle gerekli paketlerin birkaçı ile birlikte gelmez. , ve sudoshadow yükleme bashtemel ihtiyaçlarını karşılar.

RUN apk add bash sudo shadow

Kutu içi veya Market görevlerine bağımlıysanız, bunların gerektirdiği ikili dosyaları da sağlamanız 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ı olan birden çok iş

Kapsayıcı işi, Docker kayıt defteri kapsayıcısı başlatma işleminin sonunda oturumu kapatan görüntü kayıt defteri yetkilendirmesi için temel konak aracısı Docker config.json'u kullanır. Kimlik doğrulaması için sistemde kayıtlı Docker config.json dosyası paralel olarak çalışan diğer kapsayıcı işlerinden biri tarafından zaten oturumu kapatılmış olduğundan, sonraki kayıt defteri görüntüsü çekme yetkilendirmesi "yetkisiz kimlik doğrulaması" için reddedilebilir.

Çözüm, barındırılan aracıda çalışan her aracı havuzu hizmetine özgü Docker ortam değişkenini DOCKER_CONFIG ayarlamaktır. Her aracı havuzunun runsvc.sh betiğindeki dosyasını DOCKER_CONFIG dışarı aktarın:

#insert anything to set up env when running as a service
export DOCKER_CONFIG=./.docker