서비스 컨테이너

Azure DevOps Services

파이프라인에 하나 이상의 서비스를 지원해야 하는 경우 대부분의 경우 작업별로 각 서비스를 만들고, 연결하고, 클린 수 있습니다. instance 경우 파이프라인은 데이터베이스 및 메모리 캐시에 액세스해야 하는 통합 테스트를 실행할 수 있습니다. 파이프라인의 각 작업에 대해 데이터베이스 및 메모리 캐시를 새로 만들어야 합니다.

컨테이너는 파이프라인이 의존하는 서비스를 실행하는 간단하고 이식 가능한 방법을 제공합니다. 서비스 컨테이너를 사용하면 컨테이너화된 서비스의 수명 주기를 자동으로 만들고, 네트워크를 만들고, 관리할 수 있습니다. 각 서비스 컨테이너는 필요한 작업에서만 액세스할 수 있습니다. 서비스 컨테이너는 모든 종류의 작업에서 작동하지만 컨테이너 작업에서 가장 일반적으로 사용됩니다.

요구 사항

서비스 컨테이너는 또는 ENTRYPOINTCMD 정의해야 합니다. 파이프라인은 추가 인수 없이 제공된 컨테이너에 대해 실행됩니다 docker run .

Azure Pipelines는 Linux 또는 Windows 컨테이너를 실행할 수 있습니다. Linux 컨테이너용 호스트된 Ubuntu 또는 Windows 컨테이너용 호스트된 Windows 컨테이너 풀을 사용합니다. 호스트된 macOS 풀은 컨테이너 실행을 지원하지 않습니다.

단일 컨테이너 작업

컨테이너 작업을 사용하는 간단한 예:

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

이 파이프라인은 nginxDocker Hubbuildpack-deps 컨테이너를 가져온 다음 컨테이너를 시작합니다. 컨테이너는 이름으로 서로 services 연결할 수 있도록 함께 네트워크로 연결됩니다.

이 작업 컨테이너 nginx 내에서 호스트 이름은 Docker 네트워킹을 사용하여 올바른 서비스로 확인됩니다. 네트워크의 모든 컨테이너는 모든 포트를 자동으로 서로 노출합니다.

단일 작업

작업 컨테이너 없이 서비스 컨테이너를 사용할 수도 있습니다. 간단한 예는 다음과 같습니다.

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

이 파이프라인은 최신 nginx 컨테이너를 시작합니다. 작업이 컨테이너에서 실행되고 있지 않으므로 자동 이름 확인이 없습니다. 이 예제에서는 를 사용하여 localhost서비스에 연결할 수 있는 방법을 보여 줍니다. 위의 예제에서는 포트를 명시적으로 제공합니다(예: 8080:80).

다른 방법은 런타임에 임의 포트를 동적으로 할당하도록 하는 것입니다. 그런 다음 변수를 사용하여 이러한 동적 포트에 액세스할 수 있습니다. Bash 스크립트에서는 프로세스 환경을 사용하여 변수에 액세스할 수 있습니다. 이러한 변수는 형식 agent.services.<serviceName>.ports.<port>을 사용합니다. 위의 예제 redis 에서는 호스트에 임의의 사용 가능한 포트가 할당됩니다. 변수에는 agent.services.redis.ports.6379 포트 번호가 포함됩니다.

여러 작업

서비스 컨테이너는 동일한 서비스의 여러 버전에 대해 동일한 단계를 실행하는 데에도 유용합니다. 다음 예제에서는 여러 버전의 PostgreSQL에 대해 동일한 단계를 실행합니다.

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

포트

컨테이너 리소스 또는 인라인 컨테이너를 지정할 때 컨테이너에 노출할 배열을 ports 지정할 수 있습니다.

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

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

ports 동일한 Docker 네트워크의 컨테이너가 기본적으로 모든 포트를 서로 자동으로 노출하기 때문에 작업이 컨테이너에서 실행되는 경우 지정이 필요하지 않습니다.

작업이 호스트 ports 에서 실행 중인 경우 서비스에 액세스해야 합니다. 포트는 형식 <hostPort>:<containerPort> 또는 를 <containerPort>사용하며, 예를 들어 호스트 컴퓨터의 임의 포트에 바인딩된 포트6379를 통해 노출 tcp 하는 경우와 같이 6379/tcp 끝에 선택 사항이 /<protocol> 있습니다.

호스트 컴퓨터의 임의 포트에 바인딩된 포트의 경우 파이프라인은 작업에서 액세스할 수 있도록 양식 agent.services.<serviceName>.ports.<port> 의 변수를 만듭니다. 예를 들어 은 agent.services.redis.ports.6379 호스트 머신에서 임의로 할당된 포트로 확인됩니다.

볼륨

볼륨은 서비스 간에 데이터를 공유하거나 여러 작업 실행 간에 데이터를 유지하는 데 유용합니다.

볼륨 탑재를 의 volumes배열로 지정할 수 있습니다. 볼륨의 이름은 Docker 볼륨, 익명 Docker 볼륨 또는 호스트의 탑재를 바인딩할 수 있습니다.

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

볼륨은 형식 <source>:<destinationPath>을 사용합니다. 여기서 <source> 는 호스트 머신에서 명명된 볼륨 또는 절대 경로일 수 있으며 <destinationPath> 컨테이너의 절대 경로입니다.

참고

호스트 풀을 사용하는 경우 작업이 완료된 후 호스트 컴퓨터가 정리되므로 작업 간에 볼륨이 유지되지 않습니다.

기타 옵션

서비스 컨테이너는 컨테이너 작업과 동일한 컨테이너 리소스를 공유합니다. 즉, 동일한 추가 옵션을 사용할 수 있습니다.

Healthcheck

필요에 따라 서비스 컨테이너가 HEALTHCHECK를 지정하는 경우 에이전트는 작업을 실행하기 전에 컨테이너가 정상 상태가 될 때까지 기다립니다.

서비스 예제를 사용하는 여러 컨테이너

이 예제에는 두 개의 데이터베이스 컨테이너인 PostgreSQL 및 MySQL에 연결된 Django Python 웹 컨테이너가 있습니다. PostgreSQL 데이터베이스는 주 데이터베이스이며 해당 컨테이너의 이름은 db입니다. 컨테이너는 db 볼륨 /data/db:/var/lib/postgresql/data 을 사용하며 을 통해 env컨테이너에 전달되는 세 개의 데이터베이스 변수가 있습니다. 컨테이너는 mysql 포트 3306:3306 를 사용하며 를 통해 env전달되는 데이터베이스 변수도 있습니다. 컨테이너가 web 포트 8000를 사용하여 열려 있습니다. 이 단계에서는 pip 종속성을 설치한 다음 Django 테스트가 실행됩니다. 작업 예제를 설정하려면 두 개의 데이터베이스를 사용하여 Django 사이트를 설정해야 합니다. 이 예제에서는 파일이 루트 디렉터리에 있고 Django 프로젝트가 해당 디렉터리 내에 있다고 가정 manage.py 합니다. 에서 /__w/1/s/manage.py test경로를 업데이트 /__w/1/s/ 해야 할 수 있습니다.

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