如何使 Docker 容器可用于 Azure Pipelines 中的任务?
How to make a Docker container available to a task in 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.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 将 运行 从中恢复数据库 - 但我收到错误“错误:没有这样的 container:path:sqlserver_linux_container_for_integration_tests:/tmp”。所以看起来 Docker 容器没有启动,或者它不能用于我的任务。此外,第一个任务中的 docker ps
显示没有输出。
那么如何让 Docker 容器可用于我的任务,以便将文件复制到其中并执行命令?
成功解决问题。
首先,我需要声明作业依赖于要启动的容器的服务(docker ps
现在列出了它),方法是在 variables:
部分之前添加以下内容:
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'
我想 运行 我针对 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 将 运行 从中恢复数据库 - 但我收到错误“错误:没有这样的 container:path:sqlserver_linux_container_for_integration_tests:/tmp”。所以看起来 Docker 容器没有启动,或者它不能用于我的任务。此外,第一个任务中的 docker ps
显示没有输出。
那么如何让 Docker 容器可用于我的任务,以便将文件复制到其中并执行命令?
成功解决问题。
首先,我需要声明作业依赖于要启动的容器的服务(docker ps
现在列出了它),方法是在 variables:
部分之前添加以下内容:
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'