Hizmet kapsayıcılarıService containers

Azure PipelinesAzure Pipelines

İşlem hatlarınız bir veya daha fazla hizmetin desteğini gerektiriyorsa, çoğu durumda her hizmeti iş başına olarak oluşturmak, bağlanmak ve temizlemek isteyeceksiniz.If your pipeline requires the support of one or more services, in many cases you'll want to create, connect to, and clean up each service on a per-job basis. Örneğin, bir işlem hattı bir veritabanına ve bir bellek önbelleğine erişim gerektiren tümleştirme testlerini çalıştırabilir.For instance, a pipeline may run integration tests that require access to a database and a memory cache. İşlem hattındaki her iş için veritabanı ve bellek önbelleğinin yeniden oluşturulması gerekir.The database and memory cache need to be freshly created for each job in the pipeline.

Bir kapsayıcı, işlem hattınıza bağlı bir hizmeti çalıştırmak için basit ve taşınabilir bir yol sağlar.A container provides a simple and portable way to run a service that your pipeline depends on. Hizmet kapsayıcısı Kapsayıcılı hizmetinizin yaşam döngüsünü otomatik olarak oluşturmanızı, ağınızı ve yönetmenizi sağlar.A service container enables you to automatically create, network, and manage the lifecycle of your containerized service. Her hizmet kapsayıcısına yalnızca bunu gerektiren iş tarafından erişilebilir.Each service container is accessible by only the job that requires it. Hizmet kapsayıcıları her türlü işleçalışır, ancak en yaygın olarak kapsayıcı işleriile kullanılır.Service containers work with any kind of job, but they're most commonly used with container jobs.

GereksinimlerRequirements

Hizmet kapsayıcıları bir veya tanımlamalıdır CMD ENTRYPOINT .Service containers must define a CMD or ENTRYPOINT. İşlem hattı, docker run ek bağımsız değişkenler olmadan, belirtilen kapsayıcıyı kullanacaktır.The pipeline will docker run the provided container without additional arguments.

Azure Pipelines, Linux veya Windows kapsayıcılarıçalıştırabilir.Azure Pipelines can run Linux or Windows Containers. Linux kapsayıcıları için barındırılan Ubuntu ya da Windows kapsayıcıları için barındırılan Windows kapsayıcı havuzu kullanın.Use either hosted Ubuntu for Linux containers, or the Hosted Windows Container pool for Windows containers. (Barındırılan macOS havuzu, kapsayıcıları çalıştırmayı desteklemez.)(The Hosted macOS pool does not support running containers.)

Tek bir kapsayıcı işiSingle container job

Kapsayıcı işlerininkullanımına ilişkin basit bir örnek:A simple example of using container jobs:

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


pool:
  vmImage: 'ubuntu-20.04'

container: my_container
services:
  nginx: nginx

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

Bu işlem hattı, nginx buildpack-deps Docker Hub 'ından ve kapsayıcılarını getirir ve sonra kapsayıcıları başlatır.This pipeline fetches the nginx and buildpack-deps containers from Docker Hub and then starts the containers. Kapsayıcılar, birbirleriyle birbirlerine ulaşabilmeleri için birbirine bağlı olarak kullanılır services .The containers are networked together so that they can reach each other by their services name.

Bu iş kapsayıcısının içinde, nginx ana bilgisayar adları Docker ağı kullanarak doğru hizmetlere çözümlenir.From inside this job container, the nginx host names resolves to the correct services using Docker networking. Ağdaki tüm kapsayıcılar otomatik olarak birbirlerine tüm bağlantı noktalarını kullanıma sunar.All containers on the network automatically expose all ports to each other.

Tek işSingle job

Hizmet kapsayıcılarını iş kapsayıcısı olmadan da kullanabilirsiniz.You can also use service containers without a job container. Basit bir örnek:A simple example:

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

pool:
  vmImage: 'ubuntu-18.04'

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.This pipeline starts the latest nginx containers. İş bir kapsayıcıda çalışmadığı için otomatik ad çözümlemesi yoktur.Since the job is not running in a container, there's no automatic name resolution. Bu örnek, kullanarak hizmetlere nasıl ulaşabulakullanabileceğinizi gösterir localhost .This example shows how you can instead reach services by using localhost. Yukarıdaki örnekte, bağlantı noktasını açıkça sağlıyoruz (örneğin, 8080:80 ).In the above example we provide the port explicitly (for example, 8080:80).

Alternatif bir yaklaşım, rastgele bir bağlantı noktasının çalışma zamanında dinamik olarak atanmasını sağlar.An alternative approach is to let a random port get assigned dynamically at runtime. Daha sonra değişkenlerikullanarak bu dinamik bağlantı noktalarına erişebilirsiniz.You can then access these dynamic ports by using variables. Bash betiğine, işlem ortamını kullanarak bir değişkene erişebilirsiniz.In a Bash script, you can access a variable by using the process environment. Bu değişkenler şu biçimdedir: agent.services.<serviceName>.ports.<port> .These variables take the form: agent.services.<serviceName>.ports.<port>. Yukarıdaki örnekte, redis konakta rastgele kullanılabilir bir bağlantı noktası atanır.In the above example, redis is assigned a random available port on the host. agent.services.redis.ports.6379Değişken, bağlantı noktası numarasını içerir.The agent.services.redis.ports.6379 variable contains the port number.

Birden çok işMultiple jobs

Hizmet kapsayıcıları aynı adımların aynı hizmetin birden çok sürümüne karşı çalıştırılması için de kullanışlıdır.Service containers are also useful for running the same steps against multiple versions of the same service. Aşağıdaki örnekte, aynı adımlar PostgreSQL 'in birden çok sürümüne karşı çalışır.In the following example, the same steps run against multiple versions of PostgreSQL.

resources:
  containers:
  - container: my_container
    image: ubuntu:18.04
  - container: pg12
    image: postgres:12
  - container: pg11
    image: postgres:11

pool:
  vmImage: 'ubuntu-18.04'

strategy:
  matrix:
    postgres12:
      postgresService: pg12
    postgres11:
      postgresService: pg11

container: my_container

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

Bağlantı noktalarıPorts

Bir kapsayıcı kaynağını veya satır içi kapsayıcıyı belirtirken, ports kapsayıcıda göstermek için bir dizisi belirtebilirsiniz.When specifying a container resource or an inline container, you can specify an array of ports to expose on the container.

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

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

portsAynı Docker ağı üzerindeki kapsayıcılar varsayılan olarak tüm bağlantı noktalarını otomatik olarak kullanıma sunduğundan, işiniz bir kapsayıcıda çalışıyorsa belirtme gerekli değildir.Specifying ports is not required if your job is running in a container because containers on the same Docker network automatically expose all ports to each other by default.

İşiniz konakta çalışıyorsa, ports hizmete erişmeniz gerekir.If your job is running on the host, then ports are required to access the service. Bir bağlantı noktası, <hostPort>:<containerPort> ya da isteğe bağlı olarak, örneğin, <containerPort> /<protocol> 6379/tcp tcp ana makinede rastgele bir bağlantı noktasına bağlı olarak, bağlantı noktası üzerinde kullanıma sunulacak şekilde formu alır 6379 .A port takes the form <hostPort>:<containerPort> or just <containerPort>, with an optional /<protocol> at the end, for example 6379/tcp to expose tcp over port 6379, bound to a random port on the host machine.

Konak makinedeki rastgele bir bağlantı noktasına bağlı bağlantı noktaları için, işlem hattı, agent.services.<serviceName>.ports.<port> iş tarafından erişilebilecek şekilde form değişkeni oluşturur.For ports bound to a random port on the host machine, the pipeline creates a variable of the form agent.services.<serviceName>.ports.<port> so that it can be accessed by the job. Örneğin, agent.services.redis.ports.6379 ana makinedeki Rastgele atanan bağlantı noktasına çözümler.For example, agent.services.redis.ports.6379 resolves to the randomly assigned port on the host machine.

BirimlerVolumes

Birimler, hizmetler arasında veri paylaşımı veya bir işin birden fazla çalıştırması arasındaki kalıcı veriler için yararlıdır.Volumes are useful for sharing data between services, or for persisting data between multiple runs of a job.

Birim takmaları bir dizisi olarak belirtebilirsiniz volumes .You can specify volume mounts as an array of volumes. Birimler, Docker birimleri, anonim Docker birimleri olarak adlandırılabilir veya konağa bağlama bağlanabilir.Volumes can either be named Docker volumes, anonymous Docker volumes, or bind mounts on the host.

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

Birimler, her <source>:<destinationPath> yerde <source> adlandırılmış bir birim veya konak makinede mutlak bir yol olabilir ve <destinationPath> kapsayıcıda mutlak bir yoldur.Volumes take the form <source>:<destinationPath>, where <source> can be a named volume or an absolute path on the host machine, and <destinationPath> is an absolute path in the container.

Not

Barındırılan havuzlarımızı kullanıyorsanız, iş tamamlandıktan sonra ana makine temizlendiğinden, birimleriniz işler arasında kalıcı olmayacaktır.If you use our hosted pools, then your volumes will not be persisted between jobs because the host machine is cleaned up after the job is completed.

Diğer seçeneklerOther options

Hizmet kapsayıcıları aynı kapsayıcı kaynaklarını kapsayıcı işleri olarak paylaşır.Service containers share the same container resources as container jobs. Bu, aynı ek seçeneklerikullanabileceğiniz anlamına gelir.This means that you can use the same additional options.

HealthcheckHealthcheck

İsteğe bağlı olarak, herhangi bir hizmet kapsayıcısı bir Healthcheckbelirtiyorsa, aracı, işi çalıştırmadan önce kapsayıcı sağlıklı olana kadar bekler.Optionally, if any service container specifies a HEALTHCHECK, the agent waits until the container is healthy before running the job.