使用 docker compose 文件中的 extra_hosts 覆盖“localhost”条目

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

我有一个包含 Nginx 容器和 PHP-FPM 容器的 Docker Compose 文件。有时在我的 PHP 应用程序中,我在同一服务器上创建 cURL,因此请求将是 localhost/my/uri/

来自 PHP-FPM 的 cURL 请求将登陆 PHP-FPM 的 80 端口,这当然不是我想要的。我想要的是请求发送到我的主机的端口 80,该端口映射到 Nginx 容器上的端口 80。

为此,我添加了一个 extra_hosts 条目:

my-php-8:
    container_name: my-php-8
    image: php:8.3.8-fpm
    expose:
      - '9000'
    extra_hosts:
      - localhost:host-gateway
    volumes:
      - ./www/html/:/var/www/html/

问题是

/etc/hosts
文件在
127.0.0.1 localhost
添加的行之前仍然有
extra_hosts
:
my.host.ip.number localhost

这是

/ect/hosts
文件:

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.65.254  localhost
172.23.0.5  494edd959b5a

我不知道怎么做,但在我的应用程序的 PHP-FPM 7.2 的早期版本中,一切正常,因为 cURL 在无法到达 127.0.0.1 时尝试了正确的 IP。使用 PHP_FPM 8.3,第一个请求失败,但不会重试 /etc/hosts 文件中的其他 IP。

curl -v localhost
在PHP-FPM 7.2上的结果:

*   Trying ::1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* Expire in 200 ms for 4 (transfer 0x565181b35f50)
* connect to ::1 port 80 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* connect to 127.0.0.1 port 80 failed: Connection refused
*   Trying 192.168.65.254...
* TCP_NODELAY set
* Expire in 150000 ms for 3 (transfer 0x565181b35f50)
* Connected to localhost (192.168.65.254) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 403 Forbidden
< Server: nginx
< Date: Fri, 02 Aug 2024 10:02:51 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Vary: Accept-Encoding
< 
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

curl -v localhost
在PHP-FPM 7.8上的结果:

*   Trying 127.0.0.1:80...
* connect to 127.0.0.1 port 80 failed: Connection refused
*   Trying [::1]:80...
* connect to ::1 port 80 failed: Connection refused
* Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server
* Closing connection 0
curl: (7) Failed to connect to localhost port 80 after 0 ms: Couldn't connect to server

我正在寻找一种方法从

127.0.0.1 localhost
中删除
/etc/hosts
线。我尝试过手动编辑或从 Dockerfile 编辑它,但我没有权限。

或者我想让 cURL 尝试 /etc/hosts 中的每条记录。

docker nginx networking docker-compose
1个回答
0
投票

谢谢大家否决了这个问题。我看到我做错了什么😅

如果有人遇到同样的问题,这就是我所做的:

我使用的是 Mac,因此我在我的

127.0.0.1
文件中添加了一条任意名称为“my.app”的记录,指向
/etc/hosts

然后,我在

extra_hosts: - my.app:host-gateway
中添加了一个
docker-compose.yaml

现在一切正常。就是这样!

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