【问题标题】:How to make a Docker container available to a task in Azure Pipelines?如何使 Docker 容器可用于 Azure Pipelines 中的任务?
【发布时间】:2020-11-16 22:36:12
【问题描述】:

我想针对 Azure 管道内的本地 Docker 托管的 SQL Server 2019 数据库运行集成测试。我正在尝试将 sqlpackage 复制到此 Docker 映像,以便每次都可以恢复 .bacpac 以便在测试之前设置数据库。这是我到目前为止的 YAML 配置:

azure-pipelines.yml

resources:
  containers:
  - container: 'sqlserver_linux_container_for_integration_tests'
    image: 'mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-16.04'
    ports:
    - 1433:1433/tcp
    env:
      ACCEPT_EULA: 'Y'
      SA_PASSWORD: 'P@ssW0rd!'

trigger:
- azure-pipelines

pool:
  vmImage: 'ubuntu-16.04'

variables:
  buildConfiguration: 'Release'

steps:
- task: Bash@3
  displayName: 'Echo some Docker info from bash'
  inputs:
    targetType: 'inline'
    script: |
      echo 'docker info'
      docker info
      echo 'docker ps'
      docker ps

- task: Docker@2
  displayName: 'Copy sqlpackage to Docker SQL Server'
  inputs:
    command: 'cp'
    arguments: '$(Agent.BuildDirectory)/s/DBProject/_TestDb_/sqlpackage-linux/sqlpackage sqlserver_linux_container_for_integration_tests:/tmp/sqlpackage'

我想从我的Docker@2 步骤访问 Docker 容器sqlserver_linux_container_for_integration_tests,以便将 sqlpackage 二进制文件复制到其中 - 稍后将复制数据库 .bacpac,并运行 sqlpackage 以从中恢复数据库- 但我收到错误“错误:没有这样的容器:路径:sqlserver_linux_container_for_integration_tests:/tmp”。因此,看起来 Docker 容器没有启动,或者它没有对我的任务可用。另外,第一个任务中的docker ps没有显示输出。

那么我怎样才能使 Docker 容器可供我的任务用于将文件复制到其中并在其上执行命令?

【问题讨论】:

    标签: azure docker continuous-integration azure-pipelines


    【解决方案1】:

    设法解决了问题。

    首先,我需要通过在variables: 部分之前添加以下内容来声明该作业依赖于要启动的容器的服务(docker ps 现在列出了它):

    services:
      sqlserver_linux_container_for_integration_tests: sqlserver_linux_container_for_integration_tests
    

    ...但它仍然分配了一个名称,并在末尾添加了一些随机字符,这使我无法使用 docker 命令直接对其进行寻址。但是,我注意到创建了一个环境变量,其中包含将容器名称映射到其 ID 的 JSON:

    AGENT_CONTAINERMAPPING = {
      "sqlserver_linux_container_for_integration_tests": {
        "id": "623aa2b3a1505da472d051e7845bfd5f20c979f0ff94fca63fb115e2d942e8b3"
      }
    }
    

    所以我首先使用 PowerShell 任务来提取该 ID 并将其导出到变量:

    - task: PowerShell@2
      name: varsCalc
      displayName: 'Calculate variables in Powershell'
      inputs:
        targetType: 'inline'
        script: |
          $extractedId = Echo '$(Agent.ContainerMapping)' | ConvertFrom-Json | Select -Expand sqlserver_linux_container_for_integration_tests | Select -Expand id
          Echo "##vso[task.setvariable variable=sqlServerTestDbId;isOutput=true]$extractedId"
    

    然后我可以在需要容器 ID 的 Docker 任务中使用该变量,例如复制到 [containerId]:/local/container/path

    - task: Docker@2
      displayName: 'TestDb - copy sqlpackage to SQLServer container'
      inputs:
        command: 'cp'
        arguments: '$(Agent.BuildDirectory)/s/DBProject/_TestDb_/sqlpackage-linux.tgz $(varsCalc.sqlServerTestDbId):/tmp/sqlpackage-linux.tgz'
    

    【讨论】:

    • 太棒了!您可以接受您的回答,这样可以帮助遇到同样问题的其他社区成员,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多