Aracılığıyla paylaş


Hizmet kapsayıcıları

Azure DevOps Services

İşlem hattınız bir veya daha fazla hizmetin desteğini gerektiriyorsa, iş başına hizmetleri oluşturmanız, bu hizmetlere bağlanmanız ve hizmetleri temizlemeniz gerekebilir. Örneğin işlem hattınız, işlem hattındaki her iş için yeni oluşturulan bir veritabanına ve bellek önbelleğine erişim gerektiren tümleştirme testleri çalıştırabilir.

Kapsayıcı, işlem hattınızın bağlı olduğu bir hizmeti çalıştırmak için basit ve taşınabilir bir yol sağlar. Hizmet kapsayıcısı, kapsayıcılı bir hizmetin yaşam döngüsünü otomatik olarak oluşturmanıza, ağ oluşturmanıza ve yönetmenize olanak tanır. Her hizmet kapsayıcısına yalnızca bunu gerektiren iş erişebilir. Hizmet kapsayıcıları her türlü işle çalışır, ancak en yaygın olarak kapsayıcı işleriyle kullanılır.

Gereksinimler

  • Hizmet kapsayıcıları veya CMD ENTRYPOINTtanımlamalıdır. İşlem hattı, sağlanan kapsayıcı için bağımsız değişken olmadan çalışır docker run .

  • Azure Pipelines, Linux veya Windows kapsayıcılarını çalıştırabilir. Linux kapsayıcıları için barındırılan Ubuntu kapsayıcı havuzunu veya Windows kapsayıcıları için barındırılan Windows havuzunu kullanabilirsiniz. Barındırılan macOS havuzu, kapsayıcı çalıştırmayı desteklemez.

Not

Hizmet kapsayıcıları Klasik işlem hatlarında desteklenmez.

Tek kapsayıcılı iş

Aşağıdaki örnek YAML işlem hattı tanımı tek bir kapsayıcı işini gösterir.

resources:
  containers:
  - container: my_container
    image: buildpack-deps:focal
  - container: nginx
    image: nginx

pool:
  vmImage: 'ubuntu-latest'

container: my_container
services:
  nginx: nginx

steps:
- script: |
    curl nginx
  displayName: Show that nginx is running

Yukarıdaki işlem hattı Docker Hub'dan ve buildpack-deps kapsayıcılarını nginx getirir ve kapsayıcıları başlatır. Kapsayıcılar birbirine adlarıyla ulaşabilmeleri services için birbirine bağlanır.

Bu iş kapsayıcısının nginx içinden, ana bilgisayar adı Docker ağını kullanarak doğru hizmetlere çözümleniyor. Ağdaki tüm kapsayıcılar, tüm bağlantı noktalarını otomatik olarak birbirine gösterir.

Tek bir bağımsız iş

Aşağıdaki örnekte olduğu gibi hizmet kapsayıcılarını iş kapsayıcısı olmadan da kullanabilirsiniz.

resources:
  containers:
  - container: nginx
    image: nginx
    ports:
    - 8080:80
    env:
      NGINX_PORT: 80
  - container: redis
    image: redis
    ports:
    - 6379

pool:
  vmImage: 'ubuntu-latest'

services:
  nginx: nginx
  redis: redis

steps:
- script: |
    curl localhost:8080
    echo $AGENT_SERVICES_REDIS_PORTS_6379

Yukarıdaki işlem hattı en son nginx kapsayıcıları başlatır. İş bir kapsayıcıda çalışmadığından otomatik ad çözümlemesi yoktur. Bunun yerine, kullanarak localhosthizmetlere ulaşabilirsiniz. Örnek, bağlantı noktasını açıkça sağlar 8080:80 .

Alternatif bir yaklaşım, çalışma zamanında rastgele bir bağlantı noktasının dinamik olarak atanmasına izin vermektir. Ardından değişkenleri kullanarak bu dinamik bağlantı noktalarına erişebilirsiniz. Bu değişkenler şu biçimdedir: agent.services.<serviceName>.ports.<port>. Bash betiğinde, işlem ortamını kullanarak değişkenlere erişebilirsiniz.

Yukarıdaki örnekte, redis konakta rastgele kullanılabilir bir bağlantı noktası atanır. agent.services.redis.ports.6379 değişkeni bağlantı noktası numarasını içerir.

Birden çok iş

Hizmet kapsayıcıları, aynı hizmetin birden çok sürümünde aynı adımları çalıştırmak için de kullanışlıdır. Aşağıdaki örnekte, aynı adımlar PostgreSQL'in birden çok sürümünde çalıştırılır.

resources:
  containers:
  - container: my_container
    image: ubuntu:22.04
  - container: pg15
    image: postgres:15
  - container: pg14
    image: postgres:14

pool:
  vmImage: 'ubuntu-latest'

strategy:
  matrix:
    postgres15:
      postgresService: pg15
    postgres14:
      postgresService: pg14

container: my_container

services:
  postgres: $[ variables['postgresService'] ]
steps:
- script: printenv

Bağlantı Noktaları

Bir kapsayıcı kaynağını veya satır içi kapsayıcıyı çağırdığınızda, aşağıdaki örnekte olduğu gibi kapsayıcıda kullanıma sunma dizisi belirtebilirsiniz ports .

resources:
  containers:
  - container: my_service
    image: my_service:latest
    ports:
    - 8080:80
    - 5432

services:
  redis:
    image: redis
    ports:
    - 6379/tcp

ports İşiniz bir kapsayıcıda çalışıyorsa belirtme gerekli değildir, çünkü aynı Docker ağındaki kapsayıcılar varsayılan olarak tüm bağlantı noktalarını otomatik olarak birbirine gösterir.

İşiniz konakta çalışıyorsa hizmete ports erişmek için gereklidir. Bağlantı noktası formu alır veya sonunda <containerPort> isteğe bağlı /<protocol> olan bir bağlantı <hostPort>:<containerPort> noktası alır. Örneğin, 6379/tcp konak makinedeki rastgele bir bağlantı noktasına 6379bağlı bağlantı noktası üzerinden kullanıma sunartcp.

Konak makinede rastgele bir bağlantı noktasına bağlı bağlantı noktaları için işlem hattı, işin bağlantı noktasına erişebilmesi için formun agent.services.<serviceName>.ports.<port> bir değişkenini oluşturur. Örneğin, agent.services.redis.ports.6379 konak makinede rastgele atanan bağlantı noktasına çözümler.

Birimler

Birimler, hizmetler arasında veri paylaşmak veya bir işin birden çok çalıştırması arasında verileri kalıcı hale göstermek için kullanışlıdır. Birim bağlamalarını, konak makinede adlandırılmış birim veya mutlak bir yol olabileceği ve <destinationPath> kapsayıcıdaki mutlak bir yol olabileceği form <source> <source>:<destinationPath>dizisi volumes olarak belirtirsiniz. Birimler Docker birimleri, anonim Docker birimleri veya konak üzerindeki bağlama bağlamaları olarak adlandırılabilir.

services:
  my_service:
    image: myservice:latest
    volumes:
    - mydockervolume:/data/dir
    - /data/dir
    - /src/dir:/dst/dir

Not

Microsoft tarafından barındırılan havuzlar kullanıyorsanız, konak makine her iş tamamlandıktan sonra temizlendiğinden birimleriniz işler arasında kalıcı olmaz.

Başlangıç seçenekleri

Hizmet kapsayıcıları, kapsayıcı işleri ile aynı kapsayıcı kaynaklarını paylaşır. Bu, aynı başlangıç seçeneklerini kullanabileceğiniz anlamına gelir.

Durum denetimi

Herhangi bir hizmet kapsayıcısı healthcheck belirtirse aracı isteğe bağlı olarak kapsayıcının durumu iyi olana kadar işi çalıştırmadan önce bekleyebilir.

Hizmetlerle birden çok kapsayıcı örneği

Aşağıdaki örnekte PostgreSQL ve MySQL veritabanı kapsayıcılarına bağlı bir Django Python web kapsayıcısı vardır.

  • PostgreSQL veritabanı birincil veritabanıdır ve kapsayıcısı olarak adlandırılır db.
  • Kapsayıcı db birimi /data/db:/var/lib/postgresql/datakullanır ve aracılığıyla envkapsayıcıya geçirilen üç veritabanı değişkeni vardır.
  • Kapsayıcı mysql bağlantı noktasını 3306:3306kullanır ve aracılığıyla envgeçirilen veritabanı değişkenleri de vardır.
  • Kapsayıcı web , bağlantı noktası 8000ile açık.

Adımlarda bağımlılıkları pip yükler ve ardından Django testleri çalıştırılır.

Çalışan bir örnek ayarlamak için iki veritabanıyla ayarlanmış bir Django sitesi gerekir. Örnekte, manage.py dosyanızın kök dizinde olduğu ve Django projenizin de bu dizinde olduğu varsayılır. Aksi takdirde, içindeki /__w/1/s/manage.py testyolu güncelleştirmeniz /__w/1/s/ gerekebilir.

resources:
  containers:
    - container: db
      image: postgres
      volumes:
          - '/data/db:/var/lib/postgresql/data'
      env:
        POSTGRES_DB: postgres
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
    - container: mysql
      image: 'mysql:5.7'
      ports:
         - '3306:3306'
      env:
        MYSQL_DATABASE: users
        MYSQL_USER: mysql
        MYSQL_PASSWORD: mysql
        MYSQL_ROOT_PASSWORD: mysql
    - container: web
      image: python
      volumes:
      - '/code'
      ports:
        - '8000:8000'

pool:
  vmImage: 'ubuntu-latest'

container: web
services:
  db: db
  mysql: mysql

steps:
    - script: |
        pip install django
        pip install psycopg2
        pip install mysqlclient
      displayName: set up django
    - script: |
          python /__w/1/s/manage.py test