为什么不指定_proxy,CURL才能在这种情况下工作?

5jdjgkvh  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(128)

在我的虚拟机中,我有以下docker-compose.yml文件:

services:
  nginx:
    image: "nginx:1.23.1-alpine"
    container_name: parse-nginx
    ports:
      - "80:80"

  mongo-0:
    image: "mongo:5.0.6"
    container_name: parse-mongo-0
    volumes:
      - ./mongo-0/data:/data/db
      - ./mongo-0/config:/data/config

  server-0:
    image: "parseplatform/parse-server:5.2.4"
    container_name: parse-server-0
    ports:
      - "1337:1337"
    volumes:
      - ./server-0/config-vol/configuration.json:/parse-server/config/configuration.json
    command: "/parse-server/config/configuration.json"

server-0指定的configuration.json文件如下所示:

{
  "appId": "APPLICATION_ID_00",
  "masterKey": "MASTER_KEY_00",
  "readOnlyMasterKey": "only",
  "databaseURI": "mongodb://mongo-0/test"
}

使用docker compose up后,我从虚拟机执行以下命令:

curl -X POST -H "X-Parse-Application-Id: APPLICATION_ID_00" -H "Content-Type: application/json" -d '{"score":1000,"playerName":"Sean Plott","cheatMode":false}' http://localhost:1337/parse/classes/GameScore

输出为:

{"objectId":"yeHHiu01IV","createdAt":"2022-08-25T02:36:06.054Z"}

我使用以下命令进入nginx容器:

docker exec -it parse-nginx sh

parse-server-0执行ping操作,结果显示它确实解析为正确的IP地址。然后,我运行上述curl命令的修改版本,将localhost更改为该主机名:

curl -X POST -H "X-Parse-Application-Id: APPLICATION_ID_00" -H "Content-Type: application/json" -d '{"score":1000,"playerName":"Sean Plott","cheatMode":false}' http://parse-server-0:1337/parse/classes/GameScore

它给我一个504错误,如下所示:

...
        <title>504 DNS look up failed</title>
    </head>
    <body><div class="message-container">
    <div class="logo"></div>
    <h1>504 DNS look up failed</h1>
    <p>The webserver reported that an error occurred while trying to access the website. Please return to the previous page.</p>
...

但是,如果我按如下方式使用no_proxy,它就可以工作:

no_proxy="parse-server-0" curl -X POST -H "X-Parse-Application-Id: APPLICATION_ID_00" -H "X-Parse-Master-Key: MASTER_KEY_00" -H "Content-Type: application/json" -d '{"score":1000,"playerName":"Sean Plott","cheatMode":false}' http://parse-server-0:1337/parse/classes/GameScore

输出也是这样:

{"objectId":"ICTZrQQ305","createdAt":"2022-08-25T02:18:11.565Z"}

我对此感到非常困惑。很明显,parse-server-0可以通过ping到达。如果不使用no_proxy,它怎么会抛出504错误?parse-nginx容器使用默认设置和配置。我没有设置任何代理。我正在使用它测试从另一个容器到parse-mongo-0curl命令。如果有任何帮助,将不胜感激。
/etc/resolv.conf的内容为:

nameserver 127.0.0.11
options edns0 trust-ad ndots:0

parse-nginx内运行echo $HTTP_PROXY将返回:

http://10.10.10.10:8080

此值在VM中为空。

kognpnkq

kognpnkq1#

您的代理服务器似乎没有在此Docker网络中运行。因此,当请求转到该代理服务器时,它将不会查询此网络上的Docker DNS来解析其他容器名称。
如果你的应用程序没有在Docker网络之外发出请求,你可以删除代理设置。否则,你需要为你将要访问的其他Docker容器设置no_proxy

zbdgwd5y

zbdgwd5y2#

请检查echo $http_proxy的值。请注意此处的小写字母。如果设置了此值,这意味着curl被配置为使用代理。DNS解析时得到504,很可能是因为您的parse-nginx容器无法到达ip 10.10.10.10。指定no_proxy会告诉它忽略http_proxy环境变量(覆写它)并在没有任何Proxy的情况下发出要求。

holgip5t

holgip5t3#

在我的虚拟机中,~/.docker/config.json文件的内容如下:

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://10.10.10.10:8080",
     "httpsProxy": "http://10.10.10.10:8080"
   }
 }
}

这是不久前实现的,作为一些网络问题的临时修复。后来实现了一个安全证书。我完全忘记了修复。清除~/.docker/config.json文件,重做docker compose up修复了这个问题。我不再需要no_proxy来使curl工作。一切都是现在应该的。非常感谢你的帮助。

相关问题