#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"
в файле crypressdocker-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. ДА, не полезная ссылка, можете ли вы объяснить?