У меня есть файл docker-compose.yml (тестовая настройка), который содержит 3 службы: api узлов (api), интерфейс html php (clientphp) и интерфейс html/javascript, который должен заменить интерфейс php, но я не могу получить это работает (clientjs).
{ "products": [ "icecream", "milk", "fries", "cheese", "oranges", "bananas" ] }
<html>
<head>
<title>My Shop</title>
</head> <body>
<h1>Welcome to my shop</h1>
<ul>
<?php
$json = file_get_contents('http://api:3000/');
$obj = json_decode($json);
$products = $obj->products;
foreach ($products as $product) {
echo "<li>$product</li>";
}
?>
</ul> </body> </html>
fetch('http://api:3000/', { mode: 'no-cors'}) //this won't work, replacing the api in the url with the IP address will the server not found error.
.then(res => console.info(res))
.then(response => response.json())
.then(data => {
console.table(data);
return data;
})
.catch(e => {
console.info(e);
return e;
});
[Log] TypeError: Load failed (index.js, line 30)
[Error] Unhandled Promise Rejection: Not implemented on this platform
(anonymous function)
rejectPromise
reject
(anonymous function) (content-script.js:80:377615)
n (content-script.js:80:115)
(anonymous function) (content-script.js:80:906)
Global Code (content-script.js:80:915)
[Error] Failed to load resource: A server with the specified hostname could not be found. (api, line 0)
[Log] TypeError: Load failed (index.js, line 30)
Докерфайл:
FROM node
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install -y
COPY index.js ./
EXPOSE 3000
CMD node index.js
Файл docker-compose.yml:
version: '3'
services:
api:
build: .
volumes:
- .:/home/node/app
ports:
- 5001:3000
client:
image: nginx
volumes:
- ./clientjs:/usr/share/nginx/html/
ports:
- 5002:80
depends_on:
- api
php-client:
image: php:apache
volumes:
- ./clientphp:/var/www/html
ports:
- 5003:80
depends_on:
- api



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


PHP работает на клиентском экземпляре докера. Запросы от него поступают от этого клиента к API внутри виртуальной сети, созданной конфигурацией Docker Compose.
JavaScript передается из экземпляра клиентской докеры в браузер (который не работает в виртуальной сети), а JavaScript выполняется в браузере.
Браузер не может найти http://api:3000, потому что он не является частью этой виртуальной сети.
Конфигурация портов API такова 5001:3000, поэтому, если я правильно помню свой Docker, вам нужно сделать запрос на http://localhost:5001/
Это имеет большой смысл, когда вы так говорите, спасибо!