Kapsayıcı işleri tanımlama (YAML)Define container jobs (YAML)

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019

Varsayılan olarak, işler aracının yüklü olduğu ana bilgisayar makinesinde çalışır.By default, jobs run on the host machine where the agent is installed. Bu, kullanışlı ve genellikle Azure Pipelines benimsemeye başlayan projeler için uygundur.This is convenient and typically well-suited for projects that are just beginning to adopt Azure Pipelines. Zaman içinde, görevlerinizin çalıştırıldığı bağlam üzerinde daha fazla denetim istediğinizi fark edebilirsiniz.Over time, you may find that you want more control over the context where your tasks run. YAML işlem hatları bu denetim düzeyi için kapsayıcı işleri sunmaktadır.YAML pipelines offer container jobs for this level of control.

Linux ve Windows aracılarında, işler konakta veya bir kapsayıcıdaçalıştırılabilir.On Linux and Windows agents, jobs may be run on the host or in a container. (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 sabitlemesine olanak tanır.(On macOS and Red Hat Enterprise Linux 6, container jobs are not available.) Containers provide isolation from the host and allow you to pin specific versions of tools and dependencies. Konak işleri, bakım için daha az ilk kurulum ve altyapı gerektirir.Host jobs require less initial setup and infrastructure to maintain.

Kapsayıcılar, ana bilgisayar işletim sistemi üzerinde hafif bir soyutlama sunar.Containers offer a lightweight abstraction over the host operating system. İşletim sistemlerinin, araçların ve derleme için gereken bağımlılıkların tam sürümlerini seçebilirsiniz.You can select the exact versions of operating systems, tools, and dependencies that your build requires. İşlem hattınızda bir kapsayıcı belirttiğinizde, aracı ilk olarak kapsayıcıyı alıp başlatır.When you specify a container in your pipeline, the agent will first fetch and start the container. Sonra, işin her adımı kapsayıcının içinde çalışacaktır.Then, each step of the job will run inside the container. İç içe geçmiş kapsayıcılarınız olamaz.You cannot have nested containers. Bir aracı bir kapsayıcı içinde zaten çalışıyorsa kapsayıcılar desteklenmez.Containers are not supported when an agent is already running inside a container.

Tek 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 sağlar.If you need fine-grained control at the individual step level, step targets allow you to choose container or host for each step.

GereksinimlerRequirements

Linux tabanlı kapsayıcılarLinux-based containers

Azure Pipelines sistem, Linux tabanlı kapsayıcılarda birkaç şey gerektirir:The Azure Pipelines system requires a few things in Linux-based containers:

  • BashBash
  • göz BC tabanlıglibc-based
  • Node.js çalıştırılabilir (aracının sağladığı)Can run Node.js (which the agent provides)
  • Şunu tanımlamaz ENTRYPOINTDoes not define an ENTRYPOINT
  • USER , groupadd ve diğer ayrıcalık komutlarına şu olmadan erişebilir sudoUSER has access to groupadd and other privileges commands without sudo

Ve aracı ana bilgisayarınızda:And on your agent host:

  • Docker 'ın yüklü olduğundan emin olunEnsure Docker is installed
  • Aracının Docker Daemon 'a erişim izni olmalıdırThe agent must have permission to access the Docker daemon

Kapsayıcının bu araçların her birine sahip olduğundan emin olun.Be sure your container has each of these tools available. Docker Hub 'ında, özellikle de alp Linux tabanlı olanlar için kullanılabilir olan son derece aşağı kapsayıcılardan bazıları bu minimum gereksinimleri karşılamıyor.Some of the extremely stripped-down containers available on Docker Hub, especially those based on Alpine Linux, don't satisfy these minimum requirements. ENTRYPOINTAzure Pipelines bir docker create kapsayıcı ve docker exec kapsayıcının her zaman çalışır olmasını bekleyen bir dizi komut olduğundan, bir içeren kapsayıcılar çalışmayabilir.Containers with a ENTRYPOINT might not work, since Azure Pipelines will docker create an awaiting container and docker exec a series of commands which expect the container is always up and running.

Not

Windows tabanlı Linux kapsayıcıları için Node.js önceden yüklenmiş olmalıdır.For Windows-based Linux containers, Node.js must be pre-installed.

Windows KapsayıcılarıWindows Containers

Azure Pipelines, Windows kapsayıcılarıda çalıştırabilir.Azure Pipelines can also run Windows Containers. Windows Server sürüm 1803 veya üzeri gereklidir.Windows Server version 1803 or higher is required. Docker yüklü olmalıdır.Docker must be installed. İşlem hatları aracılarınızın Docker Daemon 'a erişme izni olduğundan emin olun.Be sure your pipelines agent has permission to access the Docker daemon.

Windows kapsayıcısının Node.js çalıştırmayı desteklemesi gerekir.The Windows container must support running Node.js. Temel bir Windows nano sunucu kapsayıcısının, düğümü çalıştırmak için gereken bağımlılıkları eksik.A base Windows Nano Server container is missing dependencies required to run Node.

Barındırılan aracılarHosted agents

Yalnızca windows-2019 ve ubuntu-* görüntülerinin çalışan kapsayıcıları destekler.Only windows-2019 and ubuntu-* images support running containers. MacOS görüntüsü kapsayıcıları çalıştırmayı desteklemiyor.The macOS image does not support running containers.

Tek işSingle job

Basit bir örnek:A simple example:

pool:
  vmImage: 'ubuntu-18.04'

container: ubuntu:18.04

steps:
- script: printenv

Bu, sisteme ubuntu 18.04 Docker Hub 'dan etiketlenmiş görüntüyü getirip kapsayıcıyı başlatmasını söyler.This tells the system to fetch the ubuntu image tagged 18.04 from Docker Hub and then start the container. printenvKomut çalıştırıldığında, kapsayıcının içinde olur ubuntu:18.04 .When the printenv command runs, it will happen inside the ubuntu:18.04 container.

Bir Windows örneği:A Windows example:

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şmesini gerektirir.Windows requires that the kernel version of the host and container match. Bu örnek Windows 2019 görüntüsünü kullandığından 2019 kapsayıcının etiketini kullanacağız.Since this example uses the Windows 2019 image, we will use the 2019 tag for the container.

Birden çok işMultiple jobs

Kapsayıcılar aynı adımları birden çok üzerinde çalıştırmak için de kullanışlıdır.Containers are also useful for running the same steps in multiple jobs. Aşağıdaki örnekte, aynı adımlar Ubuntu Linux birden çok sürümünde çalışır.In the following example, the same steps run in multiple versions of Ubuntu Linux. (Ve jobs yalnızca tek bir iş tanımlanmış olduğundan anahtar sözcükten bahsetmemiz gerekmez.)(And we don't have to mention the jobs keyword, since there's only a single job defined.)

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ç NoktalarEndpoints

Kapsayıcılar, Docker Hub 'dan farklı kayıt defterlerine barındırılabilir.Containers can be hosted on registries other than Docker Hub. Azure Container Registry veya başka bir özel kapsayıcı kayıt defterinde görüntü barındırmak için özel kayıt defterine bir hizmet bağlantısı ekleyin.To host an image on Azure Container Registry or another private container registry, add a service connection to the private registry. Daha sonra bir kapsayıcı belirtiminde buna başvurabilirsiniz:Then you can reference it in a container spec:

container:
  image: myprivate/registry:ubuntu1604
  endpoint: private_dockerhub_connection

steps:
- script: echo hello

veyaor

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

steps:
- script: echo hello

Diğer kapsayıcı kayıt defterleri de çalışmayabilir.Other container registries may also work. AWS kimlik bilgilerini bir Docker 'in kimlik doğrulaması için kullanabileceği bir şeyi dönüştürmek için gereken ek istemci araçları olduğundan, Amazon ECR Şu anda çalışmıyor.Amazon ECR doesn't currently work, as there are additional client tools required to convert AWS credentials into something Docker can use to authenticate.

Not

Aracının Red Hat Enterprise Linux 6 derlemesi, kapsayıcı işini çalıştırmaz.The Red Hat Enterprise Linux 6 build of the agent won't run container job. Red Hat Enterprise Linux 7 veya üzeri gibi başka bir Linux türü seçin.Choose another Linux flavor, such as Red Hat Enterprise Linux 7 or above.

SeçeneklerOptions

Kapsayıcı başlangıcını denetetmeniz gerekiyorsa, belirtebilirsiniz options .If you need to control container startup, you can specify options.

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

steps:
- script: echo hello

Çalıştırmak, docker create --help size desteklenen seçeneklerin bir listesini verecektir.Running docker create --help will give you the list of supported options.

Yeniden kullanılabilir kapsayıcı tanımıReusable container definition

Aşağıdaki örnekte, kapsayıcılar kaynaklar bölümünde tanımlanmıştır.In the following example, the containers are defined in the resources section. Ardından, kendisine atanan diğer adına başvurarak her kapsayıcıya daha sonra başvurulur.Each container is then referenced later, by referring to its assigned alias. (Burada, jobs açıklık anahtar sözcüğünü açıkça listeliyoruz.)(Here, we explicitly list the jobs keyword for clarity.)

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

Göz olmayan BC tabanlı kapsayıcılarNon glibc-based containers

Azure Pipelines Aracısı, görevleri ve betikleri çalıştırmak için gereken Node.js bir kopyasını sağlar.The Azure Pipelines agent supplies a copy of Node.js, which is required to run tasks and scripts. Node.js sürümü, barındırılan bulutta kullandığımız C çalışma zamanına göre derlenir, genellikle embc.The version of Node.js is compiled against the C runtime we use in our hosted cloud, typically glibc. Linux 'un bazı türevleri diğer C çalışma zamanlarını kullanır.Some variants of Linux use other C runtimes. Örneğin, alp Linux, MUSL kullanır.For instance, Alpine Linux uses musl.

Bir iş kapsayıcısı olarak önemli olmayan bir kapsayıcı kullanmak istiyorsanız, sizin için birkaç şey düzenlemeniz gerekir.If you want to use a non-glibc-based container as a job container, you will need to arrange a few things on your own. İlk olarak, Node.js kendi kopyanızı sağlamanız gerekir.First, you must supply your own copy of Node.js. İkinci olarak, yansımanıza Node.js ikilisini nerede bulabileceğinizi söyleyen bir etiket eklemeniz gerekir.Second, you must add a label to your image telling the agent where to find the Node.js binary. Son olarak, Stock alçam Azure Pipelines bağımlı olan diğer bağımlılıklarla birlikte gelmeyecektir: Bash, sudo,, ve groupadd.Finally, stock Alpine doesn't come with other dependencies that Azure Pipelines depends on: bash, sudo, which, and groupadd.

Kendi Node.js getirBring your own Node.js

Kapsayıcınıza bir düğüm ikilisini eklemekten siz sorumlusunuz.You are responsible for adding a Node binary to your container. Düğüm 6 güvenli bir seçenektir.Node 6 is a safe choice. node:6-alpineGörüntüden başlayabilirsiniz.You can start from the node:6-alpine image.

Node.js aracıya söyleyinTell the agent about Node.js

Aracı "com. Azure. dev. işlem hatları. Handler. Node. Path" kapsayıcı etiketini okur.The agent will read a container label "com.azure.dev.pipelines.handler.node.path". Bu etiket varsa, Node.js ikilisinin yolu olması gerekir.If this label exists, it must be the path to the Node.js binary. Örneğin, temelinde bir görüntüde node:10-alpine , bu satırı Dockerfile dosyanıza ekleyin:For example, in an image based on node:10-alpine, add this line to your Dockerfile:

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

Gereksinim eklemeAdd requirements

Azure Pipelines, ortak yönetim paketlerinin yüklü olduğu bir bash tabanlı sistem olduğunu varsayar.Azure Pipelines assumes a Bash-based system with common administration packages installed. Alp Linux, gerek duyulan bazı paketlerle birlikte gelmeyecektir.Alpine Linux in particular doesn't come with several of the packages needed. , Ve ' yi yükleme bash , sudo shadow temel ihtiyaçları kapsayacak şekilde ele alınacaktır.Installing bash, sudo, and shadow will cover the basic needs.

RUN apk add bash sudo shadow

Tüm yerleşik veya Market görevlerine bağlı kalırsanız, gereken ikilileri de sağlamanız gerekir.If you depend on any in-box or Marketplace tasks, you'll also need to supply the binaries they require.

Dockerfile 'ın tam örneğiFull example of a 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" ]

Tek bir barındırılan aracıda aracı havuzlarıyla birden çok işMultiple jobs with agent pools on a single hosted agent

Kapsayıcı işi, Docker kayıt defteri kapsayıcısı başlatmasının sonunda oturum açmış olan görüntü kayıt defteri yetkilendirmesi için arka plandaki ana bilgisayar Aracısı Docker config.jskullanır.The container job uses the underlying host agent Docker config.json for image registry authorization, which logs out at the end of the Docker registry container initialization. Kimlik doğrulama için sistemde kayıtlı olan Docker config.js, 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.Subsequent registry image pulls authorization might be denied for “unauthorized authentication” because the Docker config.json file registered in the system for authentication has already been logged out by one of the other container jobs that are running in parallel.

Çö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.The solution is to set the Docker environment variable DOCKER_CONFIG that is specific to each agent pool service running on the hosted agent. DOCKER_CONFIGHer aracı havuzunun runsvc.sh betiğine dışarı aktarın:Export the DOCKER_CONFIG in each agent pool’s runsvc.sh script:

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