Докер отказывается работать на моем локальном хосте: порт 3000

#docker #docker-compose #cypress

#докер #докер-составить #cypress

Вопрос:

Вот мой докер-compose.yml Я пытаюсь запустить cypress в своем локальном проекте, и он отказывается запускаться на порту. Что я делаю не так?

 version: '3.2'
   
# run Cypress tests and exit with command
#   docker-compose up --exit-code-from cypress
services:
  cypress:
    # the Docker image to use from https://github.com/cypress-io/cypress-docker-images
    image: "cypress/included:5.0.0"
    environment:
      - CYPRESS_baseUrl=http://localhost:3000
    # share the current folder as volume to avoid copying
    working_dir: /e2e
     command: "--browser chrome"
     ports:
     - 3333:3000
     volumes:
       - ./:/e2e
  

Результат компоновки-докера:

 cypress_1  | 
cypress_1  | Cypress automatically waits until your server is accessible before running tests.
cypress_1  | 
cypress_1  | We will try connecting to it 3 more times...
cypress_1  | We will try connecting to it 2 more times...
cypress_1  | We will try connecting to it 1 more time...
cypress_1  | 
cypress_1  | Cypress failed to verify that your server is running.
cypress_1  | 
cypress_1  | Please start this server and then run Cypress again.
e2e_cypress_1 exited with code 1
Aborting on container exit...
  

Я точно знаю, что мой localhost: 3000 запущен, я могу запустить его через браузер.

Комментарии:

1. Тестируемая система запущена на хост-компьютере на порту 3000? Если это так, то нам нужно указать внутренний IP-адрес докера хоста ( docker-machine ip ) в CYPRESS_baseUrl , а не localhost .

2. докер находится на моем локальном компьютере, и проект также локальный

3. Опять же: если тестируемая система запускается на хосте docker, а не в том же контейнере, что и cypress, тогда нам нужно указать CYPRESS_baseUrl на хост docker.

4. Правильно, тест выполняется вообще не в контейнере, cypress — это контейнер docker. Как мне определить CYPRESS_baseUrl для контейнера cypress?

5. В вашем файле компоновки. В строке - CYPRESS_baseUrl=http://localhost:3000 измените localhost IP-адрес docker-internal хоста.

Ответ №1:

Проблема в том, что контейнер не знает вашего localhost имени хоста, потому что он работает внутри изолированной сети docker. Если вы хотите, чтобы ваш контейнер знал вашу локальную сеть, вы должны использовать сеть хоста, а сетевой стек контейнера не изолирован от докера host.EG:

     version: '3.2'
    
    # run Cypress tests and exit with command
    #   docker-compose up --exit-code-from cypress
    services:
      cypress:
        # the Docker image to use from https://github.com/cypress-io/cypress-docker-images
        image: "cypress/included:5.0.0"
        environment:
          - CYPRESS_baseUrl=http://localhost:3000
        # share the current folder as volume to avoid copying
        working_dir: /e2e
        command: "--browser chrome"
        network_mode: "host"
        ports:
        - 3333:3000
        volumes:
          - ./:/e2e
  

Комментарии:

1. У меня это сработало. В моем случае я пытался загрузить пакет react из другого контейнера. Контейнер Cypress не смог его увидеть, потому что запрос был сделан на localhost, а не на имя контейнера. Это решило проблему

Ответ №2:

baseUrl можно установить в вашем файле конфигурации (cypress.json по умолчанию), а затем вы можете установить переменную среды в своей ОС, чтобы переопределить ее, как показано ниже.

Попробуйте использовать CYPRESS_BASE_URL вместо CYPRESS_baseUrl

И убедитесь, что вы используете network_mode: "host" в docker-compose file.

Другим способом вы можете определить baseUrl в crypess.json и добавить объем в контейнер docker:

 e2e-chrome:
  image: "cypress/included:4.1.0"
  # container_name: cypress
  # "cypress/included" images have entrypoint set to globally installed cypress
  # so the command can simply add any arguments
  command: "--browser chrome"
  volumes:
    - ./cypress.json:/cypress.json
  

См.: docker-compose.yml

 version: '3.2'

# run Cypress tests and exit with command
#   docker-compose up --exit-code-from cypress
services:
  cypress:
    image: "cypress/included:5.2.0"
    environment:
      - CYPRESS_BASE_URL=http://host.docker.internal:3000
    working_dir: /user-management-ui
    #command: "--browser chrome"
    network_mode: "host"
    volumes:
      - ./:/user-management-ui
  

Комментарии:

1. спасибо за ответ, я установил baseUrl внутри cypress.json как localhost:3000 , а внутри docker-compose: BASE_URL — это host.docker.internal:3000 если я установлю его как localhost:3000, я получу сообщение об ошибке. Если я запускаю его внутри cypress hub, он работает с решением, ОТЛИЧНЫМ от ДОКЕРА. Как я могу использовать только докер?

2. Убедитесь, что вам нужно удалить ports: - 3333:3000 и использовать network_mode: "host" в файле crypress docker-compose.yml

3. Я добавил для вас пример того, как мой docker-compose.yml выглядит

Ответ №3:

В моей настройке я использую docker-compose для создания сети, затем мои службы используют эту сеть для общения друг с другом. У меня есть node контейнер и еще один cypress контейнер.

 networks:
  custom:
    driver: bridge
  

Чтобы запустить мои тесты cypress через docker, я должен указать контейнер cypress на контейнер узла, который запускает сервер. В моем docker-compose вызывается контейнер узла node , который также будет именем хоста. Итак, мой docker-compose имеет CYPRESS_BASE_URL переменную среды, которая переопределяет cypress по умолчанию baseUrl из http://localhost:3000

 services:
  node:
    image: ...
    container_name: node
    volumes:
      - ./:/home/node/app
    networks:
      - custom
    ports:
      - '3000:3000'
    ...other config

  cypress:
    image: ...
    container_name: cypress
    volumes:
      - ./:/home/node/app
    networks:
      - custom
    working_dir: /home/node/app
    environment:
      - DISPLAY=
      - CYPRESS_BASE_URL=http://node:3000/ -> I can't configure this, because I'm working with external API, I don't have access to API only via http://localhost:3000
  

cypress.json:

 {
    "baseUrl": "http://localhost:3000/",
    ...
}
  

Для запуска тестов я сначала запускаю в контейнер узла, чтобы запустить сервер узла, который прослушивает http://localhost:3000 , (http://node:3000 )

 docker exec -it node bash
  

затем создайте и запустите свой проект ( npm start )

затем в другом терминале запустите в контейнер cypress

 docker exec -it cypress bash
  

затем запустите тесты:

 cypress run
  

Комментарии:

1. У меня нет локального сервера, это другой API, и с помощью этой конфигурации я все еще не могу распознать localhost: 3000 из контейнера cypress

2. localhost никогда не будет работать в сетевом режиме в качестве моста. Вам нужно установить сетевой режим на host

3. Это хост, и он все еще не работает. Не могли бы вы показать мне, где я ошибаюсь?

4. Что вы пробовали? Вы читали эту страницу? docs.docker.com/network/host

5. ДА, не полезная ссылка, можете ли вы объяснить?