【问题标题】:Testing an application inside docker container in VSTS在 VSTS 中测试 docker 容器内的应用程序
【发布时间】:2018-03-07 12:07:52
【问题描述】:

我正在尝试测试 ASP。 NET Core 2 dockerized 应用程序在 VSTS 中。它是通过 docker-compose 在 docker 容器内设置的。测试通过存储在配置中的地址发出请求(或从环境变量中获取,如果已设置)。

现在,构建设置如下:

  1. 运行 compose 命令以恢复和发布应用。
  2. 运行 compose 以创建和运行 docker 容器。
  3. 运行 bash 脚本(如下所述)。
  4. 运行测试。

首先,我发现我不能在 VSTS 中使用http://localhost:port。它在我的本地机器上运行良好,但在服务器上却无法运行。

我发现这个article 指出需要使用容器的真实 IP 来访问它。我尝试了引用的question 中描述的两种方法,但都没有奏效。

  1. 使用docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id 时,我得到Template parsing error: template: :1:24: executing "" at <.NetworkSettings.Net...>: map has no entry for key "NetworkSettings"(问题出在命令本身)
  2. 当使用docker inspect $(sudo docker ps | grep wiremocktest_microservice.gateway | head -c 12) | grep -e \"IPAddress\"\:[[:space:]]\"[0-2] | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 时,我实际上获得了IP 并可以将其传递给测试,但随后发生了一些奇怪的事情。即,它们开始超时。我试图在本地复制它,它确实如此。我对这个 IP 发出的每个请求都会超时(很容易在浏览器中检查)。

VSTS中访问容器需要使用什么地址,为什么不能使用localhost?

【问题讨论】:

  • 构建定义的任务是什么?您能否分享 OneDirve 上的详细日志(将 system.debug 设置为 true,然后进行队列构建)
  • 相关文件(如dockerfile)的详细代码是什么?
  • Dockerfile: pastebin.com/sScitR9A 不确定在哪里设置 system.debug,但基本上是:用“up”运行第一个 compose,用“up -d”运行第二个 compose,运行 bash 脚本获取容器的 IP,使用默认设置运行测试。
  • 更新:从托管 linux 代理切换到本地 windows 代理 - 立即工作。这很奇怪。
  • 使用 docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" container_name_or_id 获取 IP。 (将 ' 更改为 ")

标签: docker azure-devops asp.net-core-2.0


【解决方案1】:

在容器中运行 Azure 存储服务以进行单元测试(Gradle 和 Kotlin 项目)时,我遇到了类似的问题。本地一切正常,可以使用 localhost:10000 连接到容器(端口在运行命令中发布到主机)。但这在 VSTS 构建管道上不起作用,在尝试连接容器的 IP 时也不起作用。

我找到了一个至少在这种情况下有效的解决方案:我创建了一个自定义容器网络并将我的 Azure 存储容器和 VSTS 代理容器连接到该网络。之后,可以使用容器名称和内部端口号从测试连接到我的自定义容器,例如我的存储容器:10000。

所以我创建了一个脚本来创建容器网络,在该网络中启动我的容器,然后通过从进程列表中获取容器 ID 来连接 VSTS 代理。它是这样的:

docker network create my-custom-network
docker run --net=my-custom-network -d --name azure-storage-container -t -p 10000:10000 -v ${SCRIPT_DIR}/azurite:/opt/azurite/folder arafato/azurite
CONTAINER_ID=`docker ps -a | awk '{ print $1,$2 }' | grep microsoft/vsts-agent | awk '{print $1 }'`
docker network connect my-custom-network ${CONTAINER_ID}

之后我的测试可以使用http://azure-storage-container:10000 毫无问题地连接到 Azure 存储容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多