在脚本中运行时 curl 失败

Jac*_*son 5 curl docker docker-compose verdaccio

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

curl -v -s -X POST http://localhost:4873/_session -d \'name=some\&password=thing\'
Run Code Online (Sandbox Code Playgroud)

在任何 shell(登录/交互式)中都可以正常工作,但在脚本中执行时却惨遭失败:

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

错误输出提示连接重置:

*   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
Run Code Online (Sandbox Code Playgroud)

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

PS:在没有子shell的情况下尝试过,也会发生同样的情况,所以这与脚本或其执行方式有关。

编辑 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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 -2

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

  • 此外,在这两种情况下,调用者都从主机运行脚本;由于第一次调用可以到达已发布的端口,因此使用主机网络不应影响设置。 (3认同)
  • 请注意,这会禁用 Docker 的所有网络支持;例如,您将无法使用此选项与未发布“ports:”的容器进行通信。 (2认同)