Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure DevOps Hizmetleri | 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 görevleri doğrudan ana makinelere yüklenmiş aracılar üzerinde çalıştırılır. Barındırılan aracı işleri kullanışlıdır, çok az başlangıç kurulumu ve 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.
Bir kapsayıcı görevi için aracı önce kapsayıcıyı alıp başlatır, ardından da işin her adımını kapsayıcı içinde ç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.
Konteyner görevleri için gereksinimler
- YAML tabanlı işlem hattı. Klasik işlem hatları konteyner görevlerini 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 desteklenmiyor.
Linux tabanlı kapsayıcılar da aşağıdaki gereksinimlere sahiptir:
- Bash yüklendi.
- GNU C Kitaplığı (
glibc)tabanlı. glibc olmayan kapsayıcılar ek yapılandırma gerektirir. Daha fazla bilgi için bkz. Nonglibc tabanlı kapsayıcılar. - Hayır, hayır
ENTRYPOINT. BirENTRYPOINTiçeren kapsayıcılar çalışmayabilir, çünkü docker exec kapsayıcının sürekli çalışıyor olmasını bekler. -
USERöğesine,sudokullanılmadangroupaddve diğer ayrıcalıklı komutlara erişim sağlanır. - Ajanın sağladığı Node.js'i ç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 Docker Hub'dan 18.04 etiketiyle etiketlenmiş ubuntu görüntüsünü çekmesini 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ı ana bilgisayarı üzerinde 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ı üzerinde çalışan her aracı havuzu için DOCKER_CONFIG adlı 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 seçeneklerini belirtmek için options ö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. Önce, aynı amaç için bir container özelliği kullanıp kullanamayacağınızı kontrol edin.
Daha fazla bilgi için docker container create komut başvurusuna ve Azure Pipelines için YAML şema başvurusundaki resources.containers.container tanımına bakın.
Docker yuva eşlemesi
Aracı'nın 5.279.0 sürümünden itibaren, Linux aracılarındaki kapsayıcı işleri, ana bilgisayar Docker yuvasını (/var/run/docker.sock) varsayılan olarak iş kapsayıcısına bağlamaz. Bu varsayılan, en az ayrıcalık ilkesine dayanır; bu nedenle, container içinde Docker davranışı gerektirmeyen işlere ana makinedeki Docker daemon’una erişim verilmez.
Kapsayıcı işiniz ana bilgisayar daemon’ına karşı Docker komutları çalıştırıyorsa (Docker-in-container), kapsayıcı kaynağında mapDockerSocket değerini true olarak ayarlayarak bunu açıkça etkinleştirin.
resources:
containers:
- container: my_container
image: ubuntu:22.04
mapDockerSocket: true
Caution
Docker yuvasını eşlemenin ciddi güvenlik etkileri vardır. Kapsayıcının içindeki kod, Docker konağınızda kök olarak çalıştırılabilir. Yalnızca işiniz Docker-in-container davranışı gerektiriyorsa mapDockerSocket: true ayarlayın.
Yeniden kullanılabilir kapsayıcı tanımı
Aşağıdaki YAML örneği, kapsayıcıları resources bölümünde tanımlar ve ardından bunlara atanmış takma 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 gerekli olan Node.js'i sağ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.
Bir işlem hattında 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 Node.js ikili dosyasının konumunu gösteren bir etiket ekleyin.
-
bash,sudo,whichvegroupaddAzure 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'e yönlendirin
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 Marketplace görevlerini kullanıyorsanı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" ]