Сохранение контейнера докера postgres в задании лазурного конвейера

Я новичок в Azure и сейчас играю с конвейерами. Моя цель — запустить альпийский докер-контейнер Postgres в фоновом режиме, чтобы я мог выполнять тесты через свой бэкэнд Python.

Это моя конфигурация конвейера

trigger:
  - main
pool: 
  vmImage: ubuntu-latest
variables:
  POSTGRE_CONNECTION_STRING: postgresql+psycopg2://postgres:passw0rd@localhost/postgres
resources:
  containers:
    - container: postgres
      image: postgres:13.6-alpine
      trigger: true
      env:
        POSTGRES_PASSWORD: passw0rd
      ports:
        - 1433:1433
      options: --name postgres
stages:
  - stage: QA
    jobs:
      - job: test
        services:
          postgres: postgres
        steps:
          - task: UsePythonVersion@0
            inputs:
              versionSpec: $(PYTHON_VERSION)
          - task: Cache@2
            inputs:
              key: '"$(PYTHON_VERSION)" | "$(Agent.OS)" | requirements.txt'
              path: $(PYTHON_VENV)
              cacheHitVar: 'PYTHON_CACHE_RESTORED'
          - task: CmdLine@2
            displayName: Wait for db to start
            inputs:
              script: |
                sleep 5
          - script: |
              python -m venv .venv
            displayName: create virtual environment
            condition: eq(variables.PYTHON_CACHE_RESTORED, 'false')
          - script: |
              source .venv/bin/activate
              python -m pip install --upgrade pip
              pip install -r requirements.txt
            displayName: pip install
            condition: eq(variables.PYTHON_CACHE_RESTORED, 'false')
          - script: |
              source .venv/bin/activate
              python -m pytest --junitxml=test-results.xml --cov=app --cov-report=xml tests
            displayName: run pytest
          - task: PublishTestResults@2
            condition: succeededOrFailed()
            inputs:
              testResultsFormat: 'JUnit'
              testResultsFiles: 'test-results.xml'
              testRunTitle: 'Publish FastAPI test results'
          - task: PublishCodeCoverageResults@1
            inputs:
              codeCoverageTool: 'Cobertura'
              summaryFileLocation: 'coverage.xml'  

Но конвейер всегда дает сбой на шаге «Инициализировать контейнеры», выдавая эту ошибку: Error response from daemon: Container <containerID> is not running как будто просто отключился, потому что делать нечего. Это кажется правильным, но я не знаю, как поддерживать его работу, пока мои тесты не будут выполнены, серверная часть просто запускает pytest для базы данных. Я также попытался добавить этот ресурс в качестве контейнера, используя свойство container, но затем конвейер падает на том же этапе, говоря, что контейнер работает менее секунды.

Я благодарен за любые идеи!

🤔 А знаете ли вы, что...
Python поддерживает многозадачность и многопоточность.


1
18
1

Ответ:

Решено

Я подозреваю, что ваш контейнер не останавливается из-за того, что «нечего делать», образ postgres настроен таким образом, чтобы действовать как служба. Ваш контейнер, вероятно, останавливается из-за ошибки.

Я уверен, что есть что улучшить: вам нужно добавить PGPORT env var в свой контейнер и установить 1433, потому что этот порт не является портом по умолчанию для образа докера postgres, поэтому откройте этот порт в своем контейнере, как вы делаете with ports в этом случае не слишком много делает.

Кроме того, ваше свойство trigger: true будет означать, что вы ожидаете обновлений в официальном репозитории DockerHub для postgres, и в случае выпуска нового образа запустите свой конвейер. Я думаю, что это не имеет особого смысла, вы должны удалить его на всякий случай, хотя это маргинальная проблема с точки зрения вашего вопроса.