соедините два док-контейнера с сокетом io - PullRequest
0 голосов
/ 18 ноября 2018

В настоящее время я работаю над докеризацией протестированного приложения socket.io для простого приложения чата, используя socket.io и mocha для тестирования. сервер открывает сокет для прослушивания через порт 3000, а тестовый клиент использует сокет для отправки сообщений или получения сообщений.

Я использую файлы компоновки Docker версии 3.

Dockerfile узла сервера:

FROM node:10

WORKDIR /usr/src/appserver

COPY package*.json ./
COPY public public
COPY main.js main.js

RUN npm install
RUN npm install express
RUN npm install socket.io

CMD ["npm", "start"]

тестовый докер-файл:

FROM nodeserver

COPY test test

RUN npm update && \
    npm install -g mocha && \
    npm install -g socket.io-client

CMD ["npm", "test"]

докер-Compose:

version: "3"

services:
 nodeserver:
   build: .
   expose:
      - "3000"
   image: ws

 test:
   depends_on:
      - nodeserver
   links:
     - nodeserver
   build: ./test
   image: test_image

мой сервер узлов прослушивает порт 3000 и при подключении отправляет всем привет сообщение.

let express = require('express');
let app = express();
let http = require('http').createServer(app);
let io = require('socket.io')(http);
http.listen(3000, function ()
{
    console.log('listening on *:3000');
});

io.on('connection', function(socket)
{
    console.log('a user connected');

    io.emit('hi', 'hi');
});

и мой тест мокко выглядит следующим образом, который по сути присоединяется как клиент и ожидает прихода сообщения hi.

const url = 'ws://nodeserver:3000';


describe("Chat Server", function()
{
    it("Should broadcast hi!", function(done)
    {
        let client1 = io.connect(url, options);

        client1.on('connect', function()
        {
            client1.on('hi', function(msg)
            {
                msg.should.equal("hi");
                client1.disconnect();
                done();
            });
        });
    });
}

работает docker-compose, запускает сервер узлов, и тестовый клиент завершается неудачно с истечением времени ожидания, что говорит мне, что клиент не может видеть сеть роя.

теперь запускает докеры отдельно, то есть предоставляет серверы узлов хосту и пытается подключиться к моему локальному хосту, вместо этого работает отлично, и тест проходит. Это говорит мне о том, что мой сокет и способ, которым я общаюсь с nodeserver, должны быть правильными, что в основном означает, что у меня должны быть проблемы с настройкой сети моего роя. Может кто-нибудь сказать мне, что я делаю здесь не так?

1 Ответ

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

Я думаю, что ваша конфигурация выглядит хорошо, это вопрос готовности вашего nodeserver . Даже с depends_on нет никакой гарантии, что nodeserver будет готов к началу test . (также ссылки бесполезны и устарели).

Чтобы проверить мою гипотезу, попробуйте следующую последовательность:

docker-compose up -d nodeserver

подождите несколько секунд

docker-compose up -d test

...