В настоящее время я работаю над докеризацией протестированного приложения socket.io для простого приложения чата, используя socket.io и mocha для тестирования. сервер открывает сокет для прослушивания порта 3000, а тестовый клиент использует сокет для отправки сообщений или получения выбросов.
Я использую версию 3 для создания файлов docker.
файл докеров nodeserver:
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"]
docker-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.info('listening on *:3000');
});
io.on('connection', function(socket)
{
console.info('a user connected');
io.emit('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, а тестовый клиент терпит неудачу из-за тайм-аута, что говорит мне, что клиент не может видеть сеть роя.
теперь докеры запускаются отдельно, что открывает серверы узлов для хоста и пытается подключиться к моему локальному хосту, а вместо этого работает отлично, и тест проходит. Это говорит мне, что мой сокет и то, как я общаюсь с nodeserver, должны быть правильными, что в основном означает, что у меня должна быть проблема с настройкой сети моего роя. Может кто-нибудь сказать мне, что я здесь делаю не так?





Думаю, ваша конфигурация выглядит неплохо, это вопрос готовности вашего nodeserver. Даже с depends_on нет гарантии, что nodeserver готов, когда контрольная работа запускается. (также ссылки бесполезен и устарел).
Чтобы проверить мою гипотезу, попробуйте следующую последовательность:
docker-compose up -d nodeserver
подожди несколько секунд
docker-compose up -d test
@Armin как вы запускали отдельно?
Я выставил сервер с -p 3000: 3000 на моем хосте и запустил его непосредственно в контейнере, а затем запустил тесты без контейнера напрямую с mocha в localhost: 3000
кстати, запуск двух контейнеров без компоновки и привязки портов к localhost не будет работать, потому что второй контейнер жалуется, что порт уже выделен
эй @Siyu, у меня все еще та же проблема, даже если я подожду пару минут