如何使Docker容器可用于Azure管道中的任务?

如何使Docker容器可用于Azure管道中的任务?,azure,docker,continuous-integration,azure-pipelines,Azure,Docker,Continuous Integration,Azure Pipelines,我想对Azure管道中本地Docker托管的SQL Server 2019数据库运行集成测试。我正在尝试将sqlpackage复制到此Docker映像,以便每次都可以还原.bacpac,以便在测试之前设置数据库。以下是我到目前为止的YAML配置: azure pipelines.yml: resources: containers: - container: 'sqlserver_linux_container_for_integration_tests' image: 'mcr

我想对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
步骤,以便我可以将sqlpackage二进制文件复制到其中-稍后将复制数据库
.bacpac
,并运行sqlpackage从中恢复数据库-但我得到了错误“错误:没有这样的容器:path:sqlserver\u linux\u container\u for\u integration\u tests:/tmp”。因此,看起来Docker容器没有启动,或者没有提供给我的任务。此外,第一个任务中的
Docker ps
没有显示任何输出


因此,如何使Docker容器可用于我的任务,以便将文件复制到其中并在其上执行命令?

设法解决了这个问题

首先,我需要声明作业依赖于要启动的容器的服务(
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'

太好了!你可以接受你的答案,这样可以帮助其他社区成员解决同样的问题,谢谢。