5

尝试通过运行一个简单的命令与正在运行的 docker 容器通信curl

curl -v -s -X POST http://localhost:4873/_session -d \'name=some\&password=thing\'

在任何 shell(登录/交互)中都可以正常工作,但是在脚本中执行此操作时会失败:

temp=$(curl -v -s -X POST http://localhost:4873/_session -d \'name=some\&password=thing\')
echo $temp

错误输出提示连接重置:

*   Trying 127.0.0.1:4873...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 4873 (#0)
> POST /_session HTTP/1.1
> Host: localhost:4873
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
> 
} [29 bytes data]
* upload completely sent off: 29 out of 29 bytes
* Recv failure: Connection reset by peer <-- this! why?
* Closing connection 0

我迷路了,任何提示都表示赞赏。

PS:在没有 subshel​​l 的情况下尝试过,同样的情况发生了,所以它与脚本或它的执行方式有关。

编辑 1 添加了 docker compose 文件。我不明白为什么常规 shell 可以工作,但脚本却不行。请注意,脚本不是在 docker 中运行的,它也是从主机运行的。

version: "2.1"
services:
  verdaccio:
    image: verdaccio/verdaccio:4
    container_name: verdaccio-docker-local-storage-vol
    ports:
      - "4873:4873"
    volumes:
      - "./storage:/verdaccio/storage"
      - "./conf:/verdaccio/conf"
volumes:
  verdaccio:
    driver: local

编辑 2 所以temp=$(curl -v -s http://www.google.com)在脚本中做得很好。这是某种网络问题,但我仍然无法弄清楚原因。

编辑 3 很多人建议重新格式化有效负载数据,但即使没有有效负载,也会引发相同的错误。另请注意,我在 Linux 上,因此不确定是否有任何权限可以在这里发挥作用。

4

2 回答 2

0

如果您使用的是 bash 脚本,您可以使用以下更改更新脚本并尝试再次运行。

address="http://127.0.0.1:4873/_session"
cred="{\"name\":\"some\", \"password\":\"thing\"}"    
temp="curl -v -s -X POST $address -d $cred"
echo $temp

我怀疑问题出在脚本中,而不是 docker。

于 2020-12-03T09:07:16.950 回答
-2

如果你在默认模式下运行你的容器,docker daemon 会将它定位在另一个网络中,所以你的主机的“localhost”和你的容器是不同的。如果您想从容器中查看主机端口,请尝试使用 key 运行它--network="host"(详细说明可在此处找到)

于 2020-09-04T12:24:54.907 回答