Cypress не смог проверить, работает ли этот сервер при использовании Docker и Docker Compose - PullRequest
0 голосов
/ 05 ноября 2019

В настоящее время у меня запущены три Docker-контейнера:

  1. Docker-контейнер для интерфейсного веб-приложения (доступен через порт 8080)
  2. Docker-контейнер для фонового сервера (выставлен на порт 5000)
  3. Контейнер Docker для моей базы данных MongoDB.

Все три контейнера работают отлично, и когда я посещаю http://localhost:8080,, я могу взаимодействовать с моим веб-приложениембез проблем.

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

cypress | Cypress could not verify that this server is running:
cypress |
cypress |   > http://localhost:8080
cypress |
cypress | We are verifying this server because it has been configured as your `baseUrl`.
cypress |
cypress | Cypress automatically waits until your server is accessible before running tests.
cypress |
cypress | We will try connecting to it 3 more times...
cypress | We will try connecting to it 2 more times...
cypress | We will try connecting to it 1 more time...
cypress |
cypress | Cypress failed to verify that your server is running.
cypress |
cypress | Please start this server and then run Cypress again.

Первая потенциальная проблема (которую я исправил)

Первая потенциальная проблема описана в этом SO сообщении о том, что при запуске Cypress мое приложение не готово начать отвечать на запросы. Тем не менее, в моем Cypress Dockerfile я в настоящее время сплю в течение 10 секунд, прежде чем запустить команду Cypress, как показано ниже. Эти 10 секунд более чем достаточны, так как я могу получить доступ к своему веб-приложению из веб-браузера до выполнения команды npm run cypress-run-chrome. Я понимаю, что в документации Cypress есть некоторые причудливые решения для ожидания на http://localhost:8080, но сейчас я точно знаю, что мое приложение готово к запуску тестов Cypress.

ENTRYPOINT sleep 10; npm run cypress-run-chrome

Вторая потенциальная проблема (которую я исправил)

Вторая потенциальная проблема описывается этим SO post , то есть контейнером Docker *Файл 1038 * не содержит следующую строку. Я также исправил эту проблему, и она, похоже, не является проблемой.

127.0.0.1 localhost

Кто-нибудь знает, почему мой контейнер Cypress Docker не может подключиться к моему веб-приложению, которое яможно связаться с моим веб-браузером по http://localhost:8080?

Ниже приведен мой Dockerfile для моего контейнера Cypress

Как указано в документации Cypress о Docker , кипарис / включенное изображение уже имеет существующую точку входа. Поскольку я хочу поспать 10 секунд перед выполнением собственной команды Cypress, указанной в моем файле package.json, я переопределил ENTRYPOINT в моем Dockerfile, как показано ниже.

FROM cypress/included:3.4.1

COPY hosts /etc/

WORKDIR /e2e

COPY package*.json ./

RUN npm install --production

COPY . .

ENTRYPOINT sleep 10; npm run cypress-run-chrome

Ниже приведена команда в моем пакетеФайл .json, соответствующий npm run cypress-run-chrome.

"cypress-run-chrome": "NODE_ENV=test $(npm bin)/cypress run --config video=false --browser chrome",

Ниже приведен мой файл docker-compose.yml, который координирует все 4 контейнера.

version: '3'
services:
    web:
        build:
            context: .
            dockerfile: ./docker/web/Dockerfile
        container_name: web
        restart: unless-stopped
        ports:
            - "8080:8080"
        volumes:
            - .:/home/node/app
            - node_modules:/home/node/app/node_modules
        depends_on:
            - server
        environment:
            - NODE_ENV=testing
        networks:
            - app-network

    db:
        build:
            context: .
            dockerfile: ./docker/db/Dockerfile
        container_name: db
        restart: unless-stopped
        volumes:     
            - dbdata:/data/db
        ports:
            - "27017:27017"
        networks:
            - app-network

    server:
        build:
            context: .
            dockerfile: ./docker/server/Dockerfile
        container_name: server
        restart: unless-stopped
        ports:
            - "5000:5000"
        volumes:
            - .:/home/node/app
            - node_modules:/home/node/app/node_modules
        networks:
            - app-network
        depends_on:
            - db
        command: ./wait-for.sh db:27017 -- nodemon -L server.js

    cypress:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: cypress
        restart: unless-stopped
        volumes:
            - .:/e2e
        depends_on:
            - web
        networks:
            - app-network

networks:
    app-network:
        driver: bridge

volumes:
    dbdata:
    node_modules:

Ниже показано, как выглядит мой файл hosts, который скопирован в контейнер Cypress Docker.

127.0.0.1   localhost

Ниже приведен вид моего файла cypress.json.

{
  "baseUrl": "http://localhost:8080",
  "integrationFolder": "cypress/integration",
  "fileServerFolder": "dist",
  "viewportWidth": 1200,
  "viewportHeight": 1000,
  "chromeWebSecurity": false,
  "projectId": "3orb3g"
}
...