Aracılığıyla paylaş


YAML işlem hatlarında kapsayıcı işleri

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Bu makalede Azure Pipelines'daki kapsayıcı işleri açıklanmaktadır. Kapsayıcılar, bir işi belirli bir ortamda çalıştırmak için gerekli tüm öğeleri sağlayan konak işletim sisteminden basit soyutlamalardır.

Varsayılan olarak, Azure Pipelines işleri doğrudan konak makinelerinde yüklü aracılarda çalışır. Barındırılan aracı işleri kullanışlıdır, çok az ilk kurulum veya altyapı bakımı gerektirir ve temel projeler için uygundur. Görev bağlamı üzerinde daha fazla denetim için kapsayıcılarda işlem hattı işleri tanımlayıp çalıştırarak tam olarak istediğiniz işletim sistemlerinin, araçların ve bağımlılıkların sürümlerini alabilirsiniz.

Kapsayıcı işi için aracı önce kapsayıcıyı getirir ve başlatır ve ardından kapsayıcı içinde işin her adımını çalıştırır. Tek tek derleme adımları üzerinde daha ayrıntılı denetime ihtiyacınız varsa, adım hedeflerini kullanarak her adım için bir kapsayıcı veya konak seçebilirsiniz.

Kapsayıcı işleri için gereksinimler

  • YAML tabanlı işlem hattı. Klasik işlem hatları kapsayıcı işlerini desteklemez.
  • Windows veya Ubuntu tarafından barındırılan aracı. MacOS aracıları kapsayıcıları desteklemez. Ubuntu olmayan Linux aracılarını kullanmak için bkz. Nonglibc tabanlı kapsayıcılar.
  • Docker daemon'a erişim izniyle aracıya docker yüklendi.
  • Doğrudan konak üzerinde çalışan aracı, kapsayıcının içinde değil. İç içe kapsayıcılar desteklenmez.

Linux tabanlı kapsayıcılar da aşağıdaki gereksinimlere sahiptir:

  • Bash yüklendi.
  • GNU C Kitaplığı (glibc)tabanlı. Nonglibc kapsayıcıları ek kurulum gerektirir. Daha fazla bilgi için bkz. Nonglibc tabanlı kapsayıcılar.
  • Hayır, hayır ENTRYPOINT. ENTRYPOINT docker exec kapsayıcının her zaman çalışır durumda olmasını beklediğinden, ile kapsayıcılar çalışmayabilir.
  • USER ve diğer ayrıcalıklı komutlara groupadd erişim ile birlikte ve kullanılmadan sudosağlanır.
  • Aracının sağladığı Node.jsçalıştırabilme.

    Not

    Node.js Windows konaklarında Linux kapsayıcıları için önceden yüklenmiş olmalıdır.

Özellikle Alpine Linux tabanlı kapsayıcılar olmak üzere Docker Hub'da bulunan bazı kaldırılmış kapsayıcılar bu gereksinimleri karşılamaz. Daha fazla bilgi için bkz. Nonglibc tabanlı kapsayıcılar.

Tek iş

Aşağıdaki örnek bir Windows veya Linux tek iş kapsayıcısını tanımlar.

Bu örnek sisteme ubuntu etiketlenmiş 18.04 görüntüyü getirmesini ve ardından kapsayıcıyı başlatmasını söyler. printenv komutu ubuntu:18.04 kapsayıcısının içinde çalışır.

pool:
  vmImage: 'ubuntu-latest'

container: ubuntu:18.04

steps:
- script: printenv

Birden çok iş

Kapsayıcıları kullanarak aynı adımı birden çok işte çalıştırabilirsiniz. Aşağıdaki örnek, Ubuntu Linux'un birden çok sürümünde aynı adımı çalıştırır. Yalnızca tek bir iş tanımlandığından anahtar sözcüğünü jobs kullanmanız 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

Tek bir aracı konağındaki birden çok iş

Kapsayıcı işi, görüntü kayıt defteri yetkilendirmesi için temel konak aracısının Docker yapılandırma dosyasını kullanır. Bu dosya, Docker kayıt defteri kapsayıcısının başlatılmasının sonunda işlemin tamamlandığını belirtir.

Aracıda paralel çalışan başka bir iş Docker yapılandırma dosyasının oturumunu kapatmışsa, kapsayıcı işleri için kayıt defteri görüntüsü çekme işlemleri yetkisiz kimlik doğrulaması için reddedilebilir. Çözüm, barındırılan aracıda çalışan her aracı havuzu için çağrılan DOCKER_CONFIG bir Docker ortam değişkeni ayarlamaktır.

Her aracı havuzuna ait DOCKER_CONFIG betiğindeki aşağıdaki gibi dışa aktarın:

export DOCKER_CONFIG=./.docker

Başlangıç seçenekleri

kapsayıcı başlatma options seçeneklerini belirtmek için özelliğini kullanabilirsiniz.

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

steps:
- script: echo hello

Docker çağrısına geçirebileceğiniz seçeneklerin listesini almak için komutunu çalıştırın docker create --help . Bu seçeneklerin tümünün Azure Pipelines ile çalışacağı garanti değildir. Bir özelliği aynı amaçla kullanıp kullanamadığını container görmek için önce denetleyin.

Daha fazla bilgi için Azure Pipelines için YAML şema başvurusundaki docker kapsayıcı oluşturma komut başvurusuna ve resources.containers.container tanımına bakın.

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

Aşağıdaki YAML örneği, bölümündeki kapsayıcıları resources tanımlar ve bunlara atanan diğer adlarıyla başvurur. anahtar jobs sözcüğü netlik için kullanılır.

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

Hizmet uç noktaları

Kapsayıcıları genel Docker Hub dışındaki kayıt defterlerinde barındırabilirsiniz. Azure Container Registry'de veya özel Docker Hub kayıt defteri de dahil olmak üzere başka bir özel kapsayıcı kayıt defterinde görüntü barındırmak için, kayıt defterine erişmek için bir hizmet bağlantısı ekleyin. Ardından kapsayıcı tanımında uç noktaya başvurabilirsiniz.

Özel Docker Hub bağlantısı:

container:
  image: registry:ubuntu1804
  endpoint: private_dockerhub_connection

Azure Container Registry bağlantısı:

container:
  image: myprivate.azurecr.io/windowsservercore:1803
  endpoint: my_acr_connection

Not

Amazon ECR, Amazon Web Services (AWS) kimlik bilgilerini Docker kimlik doğrulaması için kullanılabilir hale getirmek için diğer istemci araçlarını gerektirdiği için Azure Pipelines, Amazon Elastic Container Registry (ECR) için hizmet bağlantısı kuramıyor.

glibc temelli olmayan kapsayıcılar

Barındırılan Azure Pipelines aracıları, görevleri ve betikleri çalıştırmak için gereken Node.jssağlar. Node.js sürümü genellikle glibcbarındırılan bulutta kullanılan C çalışma zamanına göre derlenmektedir. Bazı Linux varyantları diğer C çalışma zamanlarını kullanır. Örneğin Alpine Linux kullanır musl. Daha fazla bilgi için bkz. Microsoft tarafından barındırılan aracılar.

İşlem hattındaglibc tabanlı olmayan bir kapsayıcı kullanmak istiyorsanız:

  • Kendi Node.js kopyanızı sağlayın.
  • Görüntünüze Node.js ikili dosyasının konumunu gösteren bir etiket ekleyin.
  • bash, sudo, whichve groupadd Azure Pipelines bağımlılıklarını sağlayın.

Kendi Node.js'inizi temin edin

Glibc tabanlı olmayan bir kapsayıcı kullanıyorsanız kapsayıcınıza bir Node ikili dosyası eklemeniz gerekir. Node.js 18 güvenli bir seçimdir. İlk olarak node:18-alpine görselinden başlayın.

Aracıyı Node.js

Aracı kapsayıcı etiketini "com.azure.dev.pipelines.handler.node.path"okur. Bu etiket varsa, Node.js ikili dosyasının yolu olmalıdır.

Örneğin, tabanlı node:18-alpinebir görüntüde Dockerfile'ınıza aşağıdaki satırı ekleyin:

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

Gerekli paketleri ekleme

Azure Pipelines, yaygın yönetim paketlerinin yüklü olması için Bash tabanlı bir sistem gerektirir. Alpine Linux'ta gerekli paketlerden birkaçı yoktur. Temel gereksinimleri karşılamak için , bashve sudo yükleyinshadow.

RUN apk add bash sudo shadow

Yerleşik veya Market görevlerine bağımlıysanız, ihtiyaç duydukları ikili dosyaları da sağlayın.

Tam Dockerfile örneği

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" ]