docker-compose для веб-сервера и сервера приложений, форсирующих внутренние перенаправления - PullRequest
0 голосов
/ 16 ноября 2018

Изучение docker и docker-compose, работающее в стикере:

Вот мой файл docker-compose.yml:

version: '3'
services:
  site:
    build:
      context: "."
      dockerfile: "Dockerfile-site-dev"
    environment:
      - "HTTPS_METHOD=noredirect"
    volumes:
      - "./site/:/usr/share/nginx/html"
    ports:
      - "8080:80"
  app:
    build:
      context: "."
      dockerfile: "Dockerfile-server-dev"
    environment:
      - "HTTPS_METHOD=noredirect"
    volumes:
      - "./app/:/app/"
    ports:
     - "3000:3000"

Это создает nginx веб-интерфейс и nodejs / express фон в alpine изображениях.

Проблема заключается в том, что когда я запускаю 'get' для 'http://app:3000/service' с веб-страницы в контейнер приложения nodejs, он перенаправляется на https (что не удается, поскольку у меня не настроен https для контейнера - - это внутренний тест adhoc, и http только в порядке.)

Пробовал с jquery $ .get и axios.get - те же результаты.

Я могу прекрасно выполнить в контейнер «site» и пинговать «app», и если я сверну 'http://app:3000/testme' из контейнера' site '(который просто возвращает «Я здесь !!!» "ответ) он работает просто отлично.

Но что-то заставляет 307, когда я выполняю это со страницы.

Я не вижу никаких перенаправлений в конфигурации nginx (которые в любом случае влияют только на доступ к странице), и в моем коде приложения nodejs нет ничего, что могло бы вызвать перенаправление.

Похоже, что что-то в докере вызывает перенаправление.

Обратите внимание, что в файле docker-compose я установил среду "HTTPS_METHOD = noredirect" для обоих контейнеров, которая, похоже, не оказывает никакого влияния.

Любые идеи приветствуются.

Добавление:

Dockerfile-сайт-Dev:

FROM nginx:stable-alpine
WORKDIR /usr/share/nginx/html

Dockerfile-приложение-Dev:

FROM node:10.13-alpine
WORKDIR /app
RUN yarn global add nodemon
CMD ["sh","-c", "yarn install && nodemon ./index.js"]

На стороне сайта конфигурация nginx является ванильной из альпийского базового образа.

Вот index.html, который запускает запросы к серверу приложений:

<!DOCTYPE html>
<html>
<head>
  <title>Vote SSE Demo</title>
  <style>
    body {font-family:Arial, Helvetica, sans-serif;
          text-align:center;}
    #yes,#no,#message {font-size: 1.5em;}
    button {border-radius:0.5em;background-color:lightgray;}
  </style>
</head>
<body>
  <h1>Will "Hello, World!" bring world peace?</h1>
  <div><button id="yes">Yes</button></div><br>
  <div><button id="no">No</button></div>
  <br/><br/>
  <div id="message"></div>
</body>
<script src="./jquery-2.1.4.min.js"></script>
<script src="./axios.min.js"></script>
<script>
  function vote(yes) {
    console.log('voting: ' + (yes? 'yes' : 'no'));
    axios.get("http://app:3000/vote?yes=" + yes)
    .then(function(rsp) {
      $("#yes").hide();
      $("#no").hide();
      $("#message").text("Thank you for your vote!");
    })
    .catch(function(err) {
      console.log('Axios get error: ' + err);
    });
  }

  $("#yes").on("click", function(){
    vote(true);
  });

  $("#no").on("click", function() {
    vote(false);
  });
</script>
</html>

Для приложения, вот файл package.json:

{
  "name": "callbacks",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "express": "^4.16.4"
  }
}

А вот и index.js:

const express = require('express');
const sse = require('./sse');

const app = express()

let connections = [],
    votes = {yes: 0, no: 0};

app.use(sse);

app.get('/vote', function(req, res) {
  console.log('server in vote...');
  let i;

  if (req.query.yes === 'true')
    votes.yes++;
  else
    votes.no++;

  for (i = 0; ix < connections.length; ++i) {
    connections[i].sseSend(votes);
  }

  res.sendStatus(200);
});

app.get('/stream', function(req, res) {
  res.sseSetup();
  res.sseSend(votes);
  connections.push(res);
});

app.get('/testme', function(req, res) {
  console.log('server: in testme');
  res.send("I'm here!!!\n");
})

app.listen(3000);
console.log('Listening on port 3000');

SSE - это ServerEvent, и я пытаюсь это проверить.

В остальном все довольно просто.

Я думаю, что докер является подозрительным, так как я могу свернуть приложение из контейнера сайта без проблем (или, может быть, поэтому не подозрительно ...)

1 Ответ

0 голосов
/ 17 ноября 2018

HTML запускается в браузере (за пределами докера).

Браузер не знает ни о каком хосте "приложения".

Поэтому в вашем HTML замените:

    axios.get("http://app:3000/vote?yes=" + yes)

с

    axios.get("http://localhost:3000/vote?yes=" + yes)
...