[英]Testcontainers with volume mounts on custom Azure DevOps build agent running in Docker
在已经在 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 /azp
和ENTRYPOINT [ "./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 文档之后添加
这适用于某些 Testcontainers 测试,但不适用于其他测试。 更特别的是,它不适用于由 testcontainers 启动的容器需要访问已编译的类文件(存在于构建代理 docker 上)的测试。
在搜索了很多其他问题之后,我认为问题在于“内部 docker”无法“看到”“外部 docker”(构建代理)上的文件。 请参阅Docker 卷挂载在 Azure DevOps Pipeline和自托管 Azure DevOps 代理卷映射中不起作用
但是,我不清楚如何准确地应用它。
我尝试在启动构建代理 Docker 时添加-v $PWD:$PWD -w $PWD
(因为 Testcontainer 文档表明了这一点)。 但是,这会导致图像无法启动,因为./start.sh
因为 ENTRYPOINT 不再可以在 WORKDIR 更改时解析。
我还尝试将 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 本身在 Docker 容器中使用 Docker 挂载卷,但不幸的是,我无法理解如何将其应用于我的情况。
我没有通用的解决方案,但是我用testcontainers-keycloak 1.9.0 解决了我的问题,因为它不再使用绑定挂载,而是将类文件复制到容器中(请参阅https://github.com)。 com/dasniko/testcontainers-keycloak/issues/44 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.