curl在脚本内运行时失败



尝试通过运行简单的curl:与正在运行的docker容器通信

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:在没有子shell的情况下尝试,同样的情况也会发生,所以这是脚本或执行方式的问题。

编辑1添加了docker撰写文件。我不明白为什么常规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)可以很好地工作。这是某种网络问题,但我仍然没有弄清楚原因。

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

如果您使用的是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。

如果您在默认模式下运行容器,docker守护进程将在另一个网络中定位它,因此您的主机和其中一个容器的"localhost"是不同的。如果你想从你的容器中看到主机端口,试着用密钥--network="host"运行它(详细描述可以在这里找到(

相关内容

  • 没有找到相关文章

最新更新