无法连接到在 VSTS 中运行的 Docker 容器

2023-12-12

我有一个测试,启动 Docker 容器,执行验证(与 Docker 容器中的 Apache httpd 通信),然后停止 Docker 容器。

当我在本地运行此测试时,此测试运行得很好。但当它运行时托管VSTS,因此托管构建代理,无法连接到Docker容器中的Apache httpd。

这是.vsts-ci.yml file:

queue: Hosted Linux Preview

steps:
- script: |
    ./test.sh

这是test.sh重现问题的 shell 脚本:

#!/bin/bash
set -e
set -o pipefail

function tearDown {
    docker stop test-apache
    docker rm test-apache
}
trap tearDown EXIT

docker run -d --name test-apache -p 8083:80 httpd
sleep 10

curl -D - http://localhost:8083/

当我在本地运行此测试时,得到的输出是:

$ ./test.sh 
469d50447ebc01775d94e8bed65b8310f4d9c7689ad41b2da8111fd57f27cb38
HTTP/1.1 200 OK
Date: Tue, 04 Sep 2018 12:00:17 GMT
Server: Apache/2.4.34 (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>
test-apache
test-apache

这个输出完全符合我的预期。

但是当我在 VSTS 上运行此测试时,我得到的输出是(不相关的部分替换为).

2018-09-04T12:01:23.7909911Z ##[section]Starting: CmdLine
2018-09-04T12:01:23.8044456Z ==============================================================================
2018-09-04T12:01:23.8061703Z Task         : Command Line
2018-09-04T12:01:23.8077837Z Description  : Run a command line script using cmd.exe on Windows and bash on macOS and Linux.
2018-09-04T12:01:23.8095370Z Version      : 2.136.0
2018-09-04T12:01:23.8111699Z Author       : Microsoft Corporation
2018-09-04T12:01:23.8128664Z Help         : [More Information](https://go.microsoft.com/fwlink/?LinkID=613735)
2018-09-04T12:01:23.8146694Z ==============================================================================
2018-09-04T12:01:26.3345330Z Generating script.
2018-09-04T12:01:26.3392080Z Script contents:
2018-09-04T12:01:26.3409635Z ./test.sh
2018-09-04T12:01:26.3574923Z [command]/bin/bash --noprofile --norc /home/vsts/work/_temp/02476800-8a7e-4e22-8715-c3f706e3679f.sh
2018-09-04T12:01:27.7054918Z Unable to find image 'httpd:latest' locally
2018-09-04T12:01:30.5555851Z latest: Pulling from library/httpd
2018-09-04T12:01:31.4312351Z d660b1f15b9b: Pulling fs layer
[…]
2018-09-04T12:01:49.1468474Z e86a7f31d4e7506d34e3b854c2a55646eaa4dcc731edc711af2cc934c44da2f9
2018-09-04T12:02:00.2563446Z   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
2018-09-04T12:02:00.2583211Z                                  Dload  Upload   Total   Spent    Left  Speed
2018-09-04T12:02:00.2595905Z 
2018-09-04T12:02:00.2613320Z   0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to localhost port 8083: Connection refused
2018-09-04T12:02:00.7027822Z test-apache
2018-09-04T12:02:00.7642313Z test-apache
2018-09-04T12:02:00.7826541Z ##[error]Bash exited with code '7'.
2018-09-04T12:02:00.7989841Z ##[section]Finishing: CmdLine

关键是这个:

curl: (7) Failed to connect to localhost port 8083: Connection refused

10 秒应该足以让 apache 启动。 为什么可以curl无法与 Apache 的 8083 端口通信?

P.S.:

我知道像这样的硬编码端口是垃圾,我应该使用临时端口。我想让它首先使用硬编码端口运行,因为这比使用临时端口更简单,然后在硬编码端口工作后立即切换到临时端口。如果硬编码端口由于端口不可用而无法工作,则错误看起来应该有所不同,在这种情况下,docker run应该会失败,因为无法分配端口。

Update:

为了确定,我已经重新运行了测试sleep 100代替sleep 10。结果不变,curl无法连接到localhost port 8083.

更新2:

扩展脚本执行时docker logs, docker logs显示 Apache 正在按预期运行。 扩展脚本执行时docker ps,它显示以下输出:

2018-09-05T00:02:24.1310783Z CONTAINER ID        IMAGE                                                          COMMAND                  CREATED              STATUS              PORTS                  NAMES
2018-09-05T00:02:24.1336263Z 3f59aa014216        httpd                                                          "httpd-foreground"       About a minute ago   Up About a minute   0.0.0.0:8083->80/tcp   test-apache
2018-09-05T00:02:24.1357782Z 850bda64f847        microsoft/vsts-agent:ubuntu-16.04-docker-17.12.0-ce-standard   "/home/vsts/agents/2…"   2 minutes ago        Up 2 minutes                               musing_booth

问题是 VSTS 构建代理在 Docker 容器中运行。当 Apache 的 Docker 容器启动时,它与 VSTS 构建代理 Docker 容器在同一级别运行,而不是嵌套在 VSTS 构建代理 Docker 容器内。

有两种可能的解决方案:

  • 更换localhost与docker主机的ip地址,保留端口号8083
  • 更换localhost使用docker容器的ip地址,更改主机端口号8083到集装箱港口号码80.

通过 Docker 主机访问

在这种情况下,解决方案是更换localhost与 docker 主机的 IP 地址。下面的 shell 片段可以做到这一点:

host=localhost
if grep '^1:name=systemd:/docker/' /proc/1/cgroup
then
    apt-get update
    apt-get install net-tools
    host=$(route -n | grep '^0.0.0.0' | sed -e 's/^0.0.0.0\s*//' -e 's/ .*//')
fi
curl -D - http://$host:8083/

The if grep '^1:name=systemd:/docker/' /proc/1/cgroup检查脚本是否在 Docker 容器内运行。如果是这样,它会安装net-tools访问route命令,然后从route命令获取主机的IP地址。请注意,只有当容器的网络默认网关实际上是主机时,这才有效。

直接访问Docker容器

启动docker容器后,可以使用以下命令获取其ip地址:

docker container inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' <container-id>

Replace <container-id>与您的容器 ID 或名称。

所以,在这种情况下,它会是(假设第一个 IP 地址没问题):

ips=($(docker container inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' nuance-apache))
host=${ips[0]}
curl http://$host/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法连接到在 VSTS 中运行的 Docker 容器 的相关文章

随机推荐

  • 如何用javascript制作一个简单的自动播放幻灯片?

    我想制作一个简单的幻灯片放映 在页面加载时自动播放 到目前为止 这是我的代码 HTML div div img src slide 1 png div div img src slide 2 png div div img src slid
  • 使用install_github时出错:'exdir'不存在

    我正在尝试从 github 安装软件包 但不断收到以下错误 Error in unzip src list TRUE exdir does not exist 我猜测 unzip 无权创建要解压缩的目录 但我不知道如何将参数传递给 exdi
  • Boost.python自动转换参数

    我正在使用 boost python 来包装 C 类 A 该类采用字符串作为构造函数 然后我有一个函数 fun A arg 它将引用 A 作为参数 我想要一个 fun 的Python包装器 如果我传递一个对Python字符串的引用的变量 这
  • Prototype 或 JQuery 能否在 AJAX 请求上返回 HTTP 状态代码

    url http example com new Ajax Request url onComplete function transport alert transport status 如果网站正在运行 我希望返回 200 的状态 如果
  • 带有附加数据的 Swift 3 错误

    在 Swift 3 中 在错误 异常中放置 可能很多 附加信息的推荐方法是什么 捕获器可以使用它来解决 处理问题 在我见过的所有例子中 他们都使用enums 与相关的值 这对于大量信息来说似乎过于麻烦 冗长 具体来说 我正在编写一个简单的解
  • 粘贴对象时强制仅粘贴值的 Excel VBA 代码会导致奇怪的行为

    我有一个电子表格 用户可以在其中输入调查数据 并且像许多其他电子表格一样 需要防止用户覆盖各种格式功能 我使用了以下内容 Private Sub Workbook SheetSelectionChange ByVal Sh As Objec
  • 使用流和 sum 方法对 BigDecimal 列表求和

    如果列表中有所有 int 或 long 或其他原始数据类型值 那么我们使用以下方法获得所有值的 sun return items stream mapToInt i gt i sum 我有 BigDecimal 值列表 如何使用查找所有值的
  • 如何使用 Perl 6 运行外部程序? (例如 Perl 5 中的“系统”)

    我可以用system在 Perl 5 中运行外部程序 我喜欢想system就像 Perl 中的微型 Linux 命令行 但是 我找不到相关文档system在 Perl 6 中 等效的是什么 Perl6 实际上有两个命令替换system从 P
  • 纯 CSS 旋转动画在无限循环中损坏

    自从我在这里问问题以来已经有一段时间了 所以如果我做错了什么请原谅 我有一个问题CSS动画 我希望我的动画不断重复但不失去最初的效果 然而 我的代码或 CSS 动画行为似乎存在错误 首先完成后2 个旋转动画 旋转 旋转 定义的 循环开始 但
  • 查询优化:选择相交点的多边形

    我有两个 Oracle 18c 表 ply 多边形 4970 行 pnt 点数 3500 行 形状存储在 SDO GEOMETRY 列中 编辑 我现在意识到大多数点都是重复的 空间上 但我认为这不是问题 数据可以在这里查看 数据库小提琴 我
  • 在 Postgresql 的 where 子句中使用 Alias 列

    我有一个这样的查询 SELECT jobs CASE WHEN lead informations state IS NOT NULL THEN lead informations state ELSE NEW END AS lead st
  • Three.js Raycaster在浏览页面时发生偏移

    如果场景没有显示在整个页面上并且您可以滚动 Raycast 将停止工作并被您滚动的内容所抵消 向一侧滚动 20 像素 在对象下方 20 像素处单击 以便 Raycaster 正确识别该对象 如何解决这个问题 非常感谢您的帮助 使用 var
  • 如何计算句子中的单词数,忽略数字、标点符号和空格?

    我该如何计算句子中的单词数 我正在使用Python 例如 我可能有以下字符串 string I am having a very nice 23 day 那将是7个字 我在处理每个单词前后的随机空格数以及涉及数字或符号时遇到问题 str s
  • R 消息:错误 - 替换有 x 行,数据有 y

    我正在尝试使用该包ggmap使用地址列表计算目标地址的距离 我的 csv 数据如下所示 Order ID Address 1652049 435 E 70TH ST 10021 1652123 1365 YORK AVE 10021 165
  • Sonar Lint 与服务器规则不同步

    Sonar Lint 2 0 它已连接到我自己的 Sonar Qube 服务器 插件没有报告任何问题 问题是它与我的服务器规则不同步 找到了 Java 文档中提到的那些 但它们似乎也不是全部 我想知道这些java规则列表是否仅在未连接到任何
  • 将十六进制编码的字符串转换为字符串

    我想转换以下十六进制编码String在斯威夫特 3 中 dcb04a9e103a5cd8b53763051cef09bc66abe029fdebae5e1d417e2ffc2a07a4 至其等价物String J 7c f A 以下网站可以
  • R Shiny radioButtons 如何更改某些选项的颜色?

    ui lt fluidPage radioButtons dist Distribution type c Normal norm Uniform unif Log normal lnorm Exponential exp server l
  • Bootstrap 3 简单的下拉菜单不起作用

    当尝试调整到Bootstrap 3时 我遇到了以下问题 当我单击名为的按钮时F 我想Home and Not Home出现 但目前还没有 This是我正在学习的视频 div class navbar navbar inverse navba
  • 包装类的代码生成器

    您知道有一种工具可以根据另一个类生成包装类吗 编辑 通过包装类 我的意思是包装所有公开的 公共 受保护 属性方法事件的类 以便您可以将任何逻辑放在中间 我的具体目的是用它来验证包装类的行为 您可以使用 T4 模板并编写自己的逻辑 http
  • 无法连接到在 VSTS 中运行的 Docker 容器

    我有一个测试 启动 Docker 容器 执行验证 与 Docker 容器中的 Apache httpd 通信 然后停止 Docker 容器 当我在本地运行此测试时 此测试运行得很好 但当它运行时托管VSTS 因此托管构建代理 无法连接到Do