YAML işlem hatlarında kapsayıcı işleri
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Bu makalede Azure Pipelines'daki kapsayıcı işleri açıklanmaktadır.
Varsayılan olarak, Azure Pipelines işleri doğrudan aracının yüklü olduğu konak makinelerde çalışır. Barındırılan aracı işleri kullanışlıdır, bakımı için çok az ilk kurulum ve altyapı gerektirir ve temel projeler için uygundur.
Görev bağlamı üzerinde daha fazla denetim istiyorsanız kapsayıcılarda işleri tanımlayabilir ve çalıştırabilirsiniz. Kapsayıcılar, konaktan yalıtım sağlayan konak işletim sistemi üzerinde basit bir soyutlamadır. kapsayıcılarda işleri çalıştırdığınızda, derlemenizin gerektirdiği işletim sistemlerinin, araçların ve bağımlılıkların tam sürümlerini seçebilirsiniz.
Linux ve Windows aracıları işlem hattı işlerini doğrudan konakta veya kapsayıcılarda çalıştırabilir. Kapsayıcı işleri macOS'ta kullanılamaz.
Kapsayıcı işi için aracı önce kapsayıcıyı getirir ve başlatır. Ardından işin her adımı kapsayıcı içinde çalışır.
Tek tek derleme adımı düzeyinde ayrıntılı denetime ihtiyacınız varsa, adım hedefleri her adım için bir kapsayıcı veya konak seçmenize olanak tanır.
Önkoşullar
- YAML işlem hattı kullanın. Klasik işlem hatları kapsayıcı işlerini desteklemez.
- Barındırılan bir Windows veya Ubuntu aracısı kullanın. Yalnızca
windows-*
veubuntu-*
aracıları kapsayıcı çalıştırmayı destekler. Aracılarmacos-*
kapsayıcı çalıştırmayı desteklemez. - Aracınız kapsayıcı işleri için ayarlandı.
- Windows ve Linux aracılarının Docker yüklü olması ve Docker daemon'a erişmek için izne sahip olması gerekir.
- Aracı zaten bir kapsayıcı içinde çalışırken kapsayıcılar desteklenmez. İç içe kapsayıcılara sahip olamazsınız.
Ek kapsayıcı gereksinimleri
Linux tabanlı kapsayıcılar aşağıdaki gereksinimlere sahiptir. Geçici çözümler için bkz . Nonglibc tabanlı kapsayıcılar.
- Bash yüklendi
- GNU C Kitaplığı (glibc) tabanlı
- Hayır
ENTRYPOINT
- ve diğer ayrıcalıklı komutlara
groupadd
, kullanmadan erişim sağlamaUSER
sudo
- Aracının sağladığı Node.js çalıştırabilir
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. Azure Pipelines ile kapsayıcılar ENTRYPOINT
docker create
çalışmayabilir ve docker exec
kapsayıcının her zaman çalışır durumda olmasını bekler.
Tek iş örnekleri
Aşağıdaki örnekler tek bir iş için bir Windows veya Linux kapsayıcısı tanımlar.
Aşağıdaki basit örnek bir Linux kapsayıcısını tanımlar:
pool:
vmImage: 'ubuntu-latest'
container: ubuntu:18.04
steps:
- script: printenv
Yukarıdaki örnek sisteme Docker Hub'dan etiketlenen 18.04
görüntüyü getirmesini ubuntu
ve ardından kapsayıcıyı başlatmasını söyler. komutu printenv
kapsayıcı içinde ubuntu:18.04
çalışır.
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üğünden jobs
bahsetmeniz 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ğı üzerinde aracı havuzları olan 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ı başlatma işleminin sonunda oturumu kapattırır. Paralel çalışan başka bir iş Docker yapılandırma dosyasının oturumunu kapattığı için sonraki kapsayıcı işleri için unauthorized authentication
kayıt defteri görüntüsü çekme işlemleri reddedilebilir.
Çözüm, barındırılan aracıda çalışan her aracı havuzuna özgü bir Docker ortam değişkeni DOCKER_CONFIG
ayarlamaktır. Her aracı havuzunun DOCKER_CONFIG
runsvc.sh betiğindeki dosyasını aşağıdaki gibi dışarı aktarın:
export DOCKER_CONFIG=./.docker
Başlangıç seçenekleri
Aşağıdaki örnekte olduğu gibi kapsayıcı başlatmasını denetlemek için belirtebilirsiniz options
:
container:
image: ubuntu:18.04
options: --hostname container-test --ip 192.168.0.1
steps:
- script: echo hello
Çalıştırma docker create --help
, Docker çağrısına geçirebileceğiniz seçeneklerin listesini verir. Bu seçeneklerin tümünün Azure DevOps ile çalışacağı garanti değildir. Aynı hedefe ulaşmak için bir container
özelliği kullanıp kullanamadığını görmek için önce denetleyin.
Daha fazla bilgi için Azure DevOps YAML şema başvurusundaki docker create komut başvurusuna ve resources.containers.container tanımına bakın.
Yeniden kullanılabilir kapsayıcı tanımı
Aşağıdaki örnek, bölümündeki kapsayıcıları resources
tanımlar ve sonra atanan diğer adlarıyla bunlara başvurur. Anahtar jobs
sözcüğü netlik için açıkça listelenmiştir.
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'dan başka 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, AWS kimlik bilgilerini Docker'ın kimlik doğrulaması için kullanabileceği bir şeye dönüştürmek için diğer istemci araçları gerektirdiği için Azure Pipelines, Amazon Elastic Container Registry (ECR) için hizmet bağlantısı kuramaz.
Glibc tabanlı olmayan kapsayıcılar
Azure Pipelines aracısı, görevleri ve betikleri çalıştırmak için gereken Node.js 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 olarak barı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 musl kullanır.
Glibc tabanlı olmayan bir kapsayıcı kullanmak istiyorsanız şunları yapmanız gerekir:
- Kendi Node.js kopyanızı sağlayın.
- Görüntünüze, aracıya Node.js ikili dosyasını nerede bulacağını söyleyen bir etiket ekleyin.
- Azure Pipelines'ın bağımlı olduğu diğer bağımlılıkları sağlayın:
bash
,sudo
,which
vegroupadd
.
Kendi Node.js sağlayın
Glibc tabanlı olmayan bir kapsayıcı kullanıyorsanız kapsayıcınıza Node ikili dosyası eklemek sizin sorumluluğunuzdadır. Node.js 18 güvenli bir seçimdir. Görüntüden node:18-alpine
başlayın.
Aracıya Node.js hakkında bilgi ver
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-alpine
bir 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ü olduğu Bash tabanlı bir sistem olduğunu varsayar. Alpine Linux özellikle gerekli paketlerin birkaçı ile birlikte gelmez. Temel gereksinimleri karşılamak için , sudo
ve shadow
yükleyinbash
.
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ğ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" ]