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
  • USER erişimi olan ve groupadd olmayan 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