Том Docker работает только в том случае, если все файлы совпадаютPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Том Docker работает только в том случае, если все файлы совпадают

Сообщение Anonymous »

почему это работает:

Код: Выделить всё

services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./:/var/www/html
- ./default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- api
links:
- api

api:
image: php:8.2-fpm
ports:
- "9000:9000"
volumes:
- ./:/var/www/html
Но это не так

Код: Выделить всё

services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./:/usr/share/nginx/html
- ./default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- api
links:
- api

api:
image: php:8.2-fpm
ports:
- "9000:9000"
volumes:
- ./libs/php:/var/www/html

По сути, это отделяет внешний интерфейс от внутреннего, где контейнер nginx ничего не знает о php (из-за dockerignore для внешнего интерфейса nginx). Но после нескольких часов попыток единственный вариант — поместить все это в одну и ту же папку по объему, что противоречит цели контейнеризации.
Второй вариант не позволит интерфейсу отправлять запросы к серверная часть php. Все, что вы получите, это постоянные ошибки о том, что файл не существует, 404 или 502. Почему? Нет ли у контейнеров возможности отправлять запросы друг другу без необходимости явного использования одних и тех же папок и файлов?

Код: Выделить всё

├── docker-compose.yaml
├── index.html
└── libs/
├── php/
│   ├── geocodeBackend.php   # PHP files served by php-fpm
│   └── other_php_files.php
├── js/
│   └── jquery.js            # JS, Css and html served by nginx
└── css/
└── styles.css
ОБНОВЛЕНО без томов, файлов Docker, конфигурации nginx, примера вызова и сообщения об ошибке (второе обновление добавило прокси-сервер от nginx к php-fpm, который находится на порту 9000)
Написать:

Код: Выделить всё

services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
depends_on:
- api
links:
- api
develop:
watch:
- path: .
target: /usr/share/nginx/html
action: sync

api:
build:
context: .
dockerfile: Dockerfile
ports:
- "9000:9000"

Dockerfiles

Код: Выделить всё

FROM nginx:latest

COPY . /usr/share/nginx/html

COPY ./conf.d/ /etc/nginx/conf.d/

Код: Выделить всё

FROM php:8.2-fpm

WORKDIR /var/www/html

COPY .  /var/www/html
Запрос сделан из сценария jquery:

Код: Выделить всё

$("#submit_1").on("click", () => {
const inputVal = $("#input_1").val();

$.ajax({
url: "/api",
dataType: "json",
data: {
searchTerm: inputVal,
},
method: "POST",

success: (results) => console.log(results),
error: (obj, details) => console.log(obj, details),
});
}
});
Nginx default.conf

Код: Выделить всё

server {
index index.php index.html;
server_name api;
error_log /var/log/nginx/error.log debug;

root  /usr/share/nginx/html;
index  index.html index.htm;

location /api {
proxy_pass http://api:9000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Enable CORS headers
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type";
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

Ошибка:

web-1 | 2024/11/03 00:58:59 [ошибка] 30#30: *5 Recv() не удалось (104: Сброс соединения одноранговым узлом) при чтении заголовка ответа из восходящего потока, клиент: 172.18.0.1, сервер: API, запрос: «POST /api HTTP/1.1», восходящий поток: «http://172.18.0.2:9000/», хост: «localhost», реферер: "http://localhost/"


web-1 | 172.18.0.1 - - [03.11.2024:00:58:59 +0000] "POST /api HTTP/1.1" 502 157 "http://localhost/" "Mozilla/5.0 (X11; Linux x86_64; rv: 132.0) Gecko/20100101 Firefox/132.0" "-"

Контейнер PHP-FPM имеет свой файл

Код: Выделить всё

root@124743cd5330:/var/www/html# ls
Dockerfile  geocodeBackend.php

У NGINX есть

Код: Выделить всё

root@b4eba721669f:/usr/share/nginx/html# ls
50x.html      compose.dev.yaml  favicon.ico  libs
README.Docker.md  conf.d        index.html   root

Без общего тома они оба не смогут общаться. Они также оба находятся в одной сети.

Подробнее здесь: https://stackoverflow.com/questions/791 ... iles-match
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»