Hizmet kapsayıcıları

Azure DevOps Services

İşlem hattınız bir veya daha fazla hizmetin desteğini gerektiriyorsa, çoğu durumda her hizmeti iş başına oluşturmak, bağlanmak ve temizlemek istersiniz. Örneğin, bir işlem hattı veritabanına ve bellek önbelleğine erişim gerektiren tümleştirme testleri çalıştırabilir. Veritabanı ve bellek önbelleğinin işlem hattındaki her iş için yeni bir şekilde oluşturulması gerekir.

Kapsayıcı, işlem hattınızın bağımlı olduğu bir hizmeti çalıştırmak için basit ve taşınabilir bir yol sağlar. Bir hizmet kapsayıcısı, kapsayıcılı hizmetinizin 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ı, yalnızca onu gerektiren iş tarafından erişilebilir. Hizmet kapsayıcıları her türlü işle çalışır, ancak bunlar en yaygın olarak kapsayıcı işlerinde kullanılır.

Gereksinimler

Hizmet kapsayıcıları veya CMDENTRYPOINTtanımlamalıdır. sağlanan kapsayıcı için işlem hattı ek bağımsız değişkenler olmadan çalıştırılır docker run .

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

Tek kapsayıcı işi

Kapsayıcı işlerini kullanmanın basit bir örneği:

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

Bu işlem hattı, vebuildpack-deps kapsayıcılarını nginx Docker Hub 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ğı kullanarak doğru hizmetlere çözümlenmektedir. Ağdaki tüm kapsayıcılar tüm bağlantı noktalarını otomatik olarak birbirine gösterir.

Tek iş

Hizmet kapsayıcılarını iş kapsayıcısı olmadan da kullanabilirsiniz. Basit bir örnek:

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

Bu işlem hattı en son nginx kapsayıcıları başlatır. İş bir kapsayıcıda çalışmadığından otomatik ad çözümlemesi yoktur. Bu örnekte, kullanarak localhosthizmetlere nasıl ulaşabileceğiniz gösterilir. Yukarıdaki örnekte, bağlantı noktasını açıkça (örneğin, 8080:80) sağlıyoruz.

Alternatif bir yaklaşım, çalışma zamanında rastgele bir bağlantı noktasının dinamik olarak atanmasına izin vermektir. Daha sonra değişkenleri kullanarak bu dinamik bağlantı noktalarına erişebilirsiniz. Bash betiğinde işlem ortamını kullanarak bir değişkene erişebilirsiniz. Bu değişkenler şu biçimi alır: agent.services.<serviceName>.ports.<port>. Yukarıdaki örnekte konakta redis rastgele kullanılabilir bir bağlantı noktası atanmıştı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 yararlı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ı

Kapsayıcı kaynağını veya satır içi kapsayıcıyı belirtirken, 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 aynı Docker ağındaki kapsayıcılar varsayılan olarak tüm bağlantı noktalarını otomatik olarak birbirine sunduğundan, işiniz kapsayıcıda çalışıyorsa belirtme gerekli değildir.

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

İşlem hattı, konak makinedeki rastgele bir bağlantı noktasına bağlı bağlantı noktaları için, iş tarafından erişilmesi 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ı dizisi volumesolarak belirtebilirsiniz. Birimler Docker birimleri, anonim Docker birimleri veya konağa bağlamalar olarak adlandırılabilir.

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

Birimler, <source> konak makinede adlandırılmış bir birim veya mutlak yol olabilecek biçimdedir <source>:<destinationPath>ve <destinationPath> kapsayıcıdaki mutlak bir yoldur.

Not

Barındırılan havuzlarımızı kullanırsanız, konak makine iş tamamlandıktan sonra temizlendiğinden birimleriniz işler arasında kalıcı olmaz.

Diğer seçenekler

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

Sistem Durumu Denetimi

İsteğe bağlı olarak, herhangi bir hizmet kapsayıcısı HEALTHCHECK belirtirse aracı, işi çalıştırmadan önce kapsayıcının iyi durumda olmasına kadar bekler.

Hizmetler içeren birden çok kapsayıcı örneği

Bu örnekte iki veritabanı kapsayıcısına bağlı bir Django Python web kapsayıcısı vardır: PostgreSQL ve MySQL. PostgreSQL veritabanı birincil veritabanıdır ve kapsayıcısı adına dbsahiptir. Kapsayıcı db birimi /data/db:/var/lib/postgresql/data kullanır ve aracılığıyla envkapsayıcıya geçirilen üç veritabanı değişkeni vardır. Kapsayıcı mysql bağlantı noktasını 3306:3306 kullanı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 pip bağımlılıkları yükler ve ardından Django testi çalıştırılır. Çalışan bir örnek ayarlamak isterseniz , iki veritabanıyla ayarlanmış bir Django sitesi gerekir. Bu örnekte dosyanızın manage.py kök dizinde ve Django projenizin de bu dizinde olduğu varsayılır. 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