尝试使用curl从Azure Pipeline中的另一个容器访问Docker容器时连接被拒绝

问题描述 投票:0回答:1

我有两个 Docker 容器。容器 A 连接到 postgresql 数据库,容器 B 是一个客户端,它应该通过 A 的端口 9292 使用“curl”将数据放入数据库中。这是我从 B 中的 python 脚本中使用 subprocess() 运行的命令:

broker_addr = "pactbroker"
broker_port = "9292"     
command = "curl -v -XPUT -H 'Content-Type: application/json' -u 'pact_broker:pact_broker' -d@repo/consumer-provider.json http://" + broker_addr + ":" + broker_port + "/pacts/provider/Provider/consumer/Consumer/version/1.0.0"
                subprocess.run('exec bash -c "' + command + '"', shell=True)

我已经在本地设置了两个容器,效果非常好。但是,当我尝试在 Azure Devops Pipeline 中执行相同操作时,我收到以下错误消息:

curl: (7) Failed to connect to pactbroker port 9292: Connection refused

我尝试对两个容器使用 --network 标志,但这并没有改变任何东西。这些是我尝试构建容器 A 的命令。名称应该是正确的,它在 TCP 端口 9292 上运行,我还公开了该端口:

run --network pactnet --name pactbroker -p 9292:9292 --expose 9292 --expose 1234 --expose 5432 --env PGPASSWORD="password" -e PACT_BROKER_DATABASE_USERNAME=pact_broker -e PACT_BROKER_DATABASE_PASSWORD=pact_broker -e PACT_BROKER_DATABASE_HOST=hostname -e PACT_BROKER_DATABASE_NAME=pact_broker -d img_pactbroker  

这是与 docker-compose 文件相同的命令:

version: "3"

services:
  pactbroker:
    image: img_pactbroker
    container_name: pactbroker
    expose:
      - 9292
    ports:
      - 9292:9292
    environment:
      PACT_BROKER_DATABASE_HOST: "hostname"
      PACT_BROKER_DATABASE_NAME: "pact_broker"
      PACT_BROKER_DATABASE_USERNAME: "pact_broker"
      PACT_BROKER_DATABASE_PASSWORD: "pact_broker"
      PGPASSWORD: "password"
      
networks:
  default:
    external: true
    name: pactnet
    
volumes:
  postgres-volume:

我的第一个猜测是它可能与代理有关,所以我将代理标志添加到我的 python 命令中:

command = "curl --proxy http://proxyaddress:8080 -v -XPUT -H 'Content-Type: application/json' -u 'pact_broker:pact_broker' -d@repo/consumer-provider.json http://" + broker_addr + ":" + broker_port + "/pacts/provider/Provider/consumer/Consumer/version/1.0.0"

这导致了错误网关错误。据我了解,该命令现在尝试将数据推送到代理:

> Authorization: Basic cGFjdF9icm9rZXI6cGFjdF9icm9rZXI=
> User-Agent: curl/7.77.0
> Accept: */*
> Proxy-Connection: Keep-Alive
> Content-Type: application/json
> Content-Length: 2513
> 

* Mark bundle as not supporting multiuse
< HTTP/1.1 502 Bad Gateway
< Server: squid/3.5.27
< Mime-Version: 1.0
< Date: Tue, 13 Jul 2021 13:25:52 GMT
< Content-Type: text/html;charset=utf-8
< Content-Length: 3835
< X-Squid-Error: ERR_ZERO_SIZE_OBJECT 0
< Vary: Accept-Language
< Content-Language: en
< X-Cache: MISS from proxyserver02
< X-Cache-Lookup: MISS from proxyserver02:8080
< Via: 1.1 proxyserver02 (squid/3.5.27)
< Connection: keep-alive

我还尝试在构建容器时重置代理环境,但这也没有帮助。

--env http_proxy="" --env https_proxy="" 

这是我为容器 A 构建镜像的 Dockerfile:

FROM pactfoundation/pact-broker:latest

ENV VSTSUSER 1003

ENV GEM_HOME="/usr/local/bundle"
ENV PATH $GEM_HOME/bin:$GEM_HOME/gems/bin:$PATH

WORKDIR $HOME
USER root

RUN apk update && apk add
RUN apk upgrade

RUN apk update && apk add --no-cache --virtual build-dependencies build-base

RUN apk update && apk add bash
RUN apk add postgresql
RUN apk add ruby

我不知道是什么原因导致此连接问题。我一定是错过了什么。

docker azure-devops connection
1个回答
0
投票

我强烈推荐使用 docker-composer,阅读单独的行看起来很痛苦。

第二,使用“网络”并不能让机器(机器=容器)A知道机器B正在接收名称为“app”(或任何其他名称)的请求。 我留下了一个如何使用 docker compose 提出问题的示例。您也可能缺少“extra_hosts”标签。

© www.soinside.com 2019 - 2024. All rights reserved.