在 Docker 中运行的自定义 Azure DevOps 构建代理上具有卷装载的测试容器

Posted

技术标签:

【中文标题】在 Docker 中运行的自定义 Azure DevOps 构建代理上具有卷装载的测试容器【英文标题】:Testcontainers with volume mounts on custom Azure DevOps build agent running in Docker 【发布时间】:2021-12-17 00:18:19 【问题描述】:

我无法在已在 Docker 中运行的自我管理的自定义 Azure DevOps 代理上运行一些使用 Testcontainers 的集成测试。

主机是 Azure 上的 Ubuntu 20.04 虚拟机。它安装了 Docker,并且运行了 2 个 docker 映像,一个用于我们基于 Java 的构建,一个用于基于 Angular 的构建。在基于 Java 的内部,我们使用 Testcontainers 运行 Maven。

为构建代理本身创建的 Docker 映像基于https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/docker?view=azure-devops#linux 上的文档。它运行 Ubuntu 18.04,具有 WORKDIR /azpENTRYPOINT [ "./start.sh" ]

构建代理通过以下方式在主机上手动启动:

docker run -d --name build-agent-java-1 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e AZP_URL=https://dev.azure.com/my-organisation \
  -e AZP_TOKEN=<mytoken> \
  -e AZP_AGENT_NAME=agent-1 \ 
  custombuildagentcr.azurecr.io/ubuntu1804-java11

-v /var/run/docker.sock:/var/run/docker.sock 在Testcontainers documentation 之后添加

这适用于某些 Testcontainers 测试,但不适用于其他测试。更具体地说,它不适用于由 testcontainers 启动的容器需要访问已编译的类文件(存在于构建代理 docker 上)的测试。

在搜索了很多其他问题之后,我认为问题在于“内部 docker”无法“看到”“外部 docker”(构建代理)上的文件。见Docker volume mounts not working in Azure DevOps Pipeline和Selfhosted Azure DevOps Agents volume mapping

但是,我不清楚如何准确地应用它。

我尝试在启动构建代理 Docker 时添加 -v $PWD:$PWD -w $PWD(因为 Testcontainer 文档指出了这一点)。但是,这会导致图像无法以./start.sh 启动,因为 WORKDIR 更改后,ENTRYPOINT 无法再解析。

我还尝试将 ENTRYPOINT 更改为使用绝对路径 /azp/start.sh(并且还在该 start.sh 文件中执行 cd /azp),但这仍然不起作用。

如果我检查可用的安装,它会返回:

devops-agent-host-user@shared-devops-agent-host:~$ docker inspect build-agent-java-1 | jq '.[0].Mounts'
[
  
    "Type": "bind",
    "Source": "/home/devops-agent-host-user",
    "Destination": "/home/devops-agent-host-user",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  ,
  
    "Type": "bind",
    "Source": "/var/run/docker.sock",
    "Destination": "/var/run/docker.sock",
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  
]

Azure 本身有 Mounting volumes using Docker within a Docker container,但遗憾的是我不明白如何将其应用于我的情况。

【问题讨论】:

【参考方案1】:

我没有通用的解决方案,但是 testcontainers-keycloak 1.9.0 解决了我的问题,因为它不再使用绑定挂载,而是将类文件复制到容器中(参见 https://github.com/dasniko/testcontainers-keycloak/issues/44 )。

【讨论】:

以上是关于在 Docker 中运行的自定义 Azure DevOps 构建代理上具有卷装载的测试容器的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Azure Windows Server DSVM 上创建自定义的基于 Linux 的 Docker 映像

如何在 Azure 管道中运行 docker 容器?

如何在 Azure Devops 中添加我们自己的自定义图表

在 Azure B2C 的自定义策略中找不到声明 - Saml

Azure 指标警报中的自定义 Json 有效负载

Api 的自定义身份验证 Azure 移动服务