如何解决Docker拒绝在我的本地主机:3000端口上工作
这是我的docker-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
compose-docker的结果
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正在运行,我可以通过浏览器运行它。
解决方法
问题是该容器不知道您的localhost
主机名,因为它在隔离的docker网络中运行。如果您想让容器知道您的本地网络,则必须Use host networking,并且容器的网络堆栈不会与Docker主机隔离。例如:
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
,
在我的设置中,我使用docker-compose创建一个网络,然后我的服务使用该网络互相通信。我有一个node
容器和另一个cypress
容器。
networks:
custom:
driver: bridge
要通过docker运行cypress测试,我必须将cypress容器指向运行服务器的节点容器。在我的docker-compose中,节点容器称为node
,它也是主机名。因此,我的docker-compose有一个CYPRESS_BASE_URL
环境变量,它覆盖了http:// localhost:3000
baseUrl
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
,
可以在配置文件(默认情况下为cypress.json)中设置baseUrl-然后您可以在操作系统中设置一个环境变量以覆盖它,如下所示。
尝试使用CYPRESS_BASE_URL
代替CYPRESS_baseUrl
并确保在docker-compose文件中使用network_mode: "host"
。
另一种方法,您可以在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
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。