我试图实现的是模拟google oauth2端点的响应。
这是我的设置:
# docker-compose.yml
version: '3.8'
services:
busybox:
image: yauritux/busybox-curl:latest
command: tail -f /dev/null
networks:
- our-network
api-mock:
image: mockserver/mockserver
networks:
our-network:
aliases:
- oauth2.googleapis.com
environment:
MOCKSERVER_INITIALIZATION_JSON_PATH: /api-mock/expectations_init.json
MOCKSERVER_WATCH_INITIALIZATION_JSON: 'true'
volumes:
- ./api-mock/:/api-mock
ports:
- 1080:1080
networks:
our-network:
我们对Mockserver的期望# ./api-mock/expectations_init.json
[
{
"httpRequest": {
"method": "GET",
"path": "/token",
"secure": true
},
"httpResponse": {
"statusCode": 200,
"body": "Hello World - secure"
}
},
{
"httpRequest": {
"method": "GET",
"path": "/token",
"secure": false
},
"httpResponse": {
"statusCode": 200,
"body": "Hello World"
}
}
]
我的项目结构stackoverflow
- ./api-mock
- expectations_init.json
- docker-compose.yml
要运行此最小示例,只需运行docker-compose up -d
查看模拟服务器的仪表板localhost:1080/mockserver/dashboard
我期望的工作是:docker exec stackoverflow_busybox_1 curl -k https://oauth2.googleapis.com/token
# curl: (7) Failed connect to oauth2.googleapis.com:443; Connection refused
起作用的是:docker exec stackoverflow_busybox_1 curl -k https://oauth2.googleapis.com:1080/token
# Hello World - secure
同样在这里,预计可以工作:docker exec stackoverflow_busybox_1 curl -k http://oauth2.googleapis.com/token
# curl: (7) Failed connect to oauth2.googleapis.com:80; Connection refused
以及什么有效:docker exec stackoverflow_busybox_1 curl -k http://oauth2.googleapis.com:1080/token
# Hello World
我错过了配置以在不通过端口的情况下获得响应的原因,因为我无法控制供应商代码正在调用的URL。我无法在模拟服务器的文档中找到有关此用例的任何提示以实现此目的。也许这是docker / docker-compose的问题?最好的祝福
最佳答案
问题不在docker-compose中,而在模拟服务器镜像中。由于它是在没有root权限的情况下执行的,因此它无法使用端口80,但始终在端口1080上启动(有关详细信息,请单击https://www.mock-server.com/where/docker.html#run_docker_container)。
您可以使用以下方法通过启动docker镜像来更改端口:
docker run --rm --name mockserver mockserver/mockserver -serverPort 1090
这样可以使镜像在端口1090上运行(这不是您想要的),或者您可以强制容器以root用户身份运行并将端口更改为80。docker run --user root --rm --name mockserver mockserver/mockserver -serverPort 80
无论如何,可能有充分的理由不为此使用root。我从未使用过该软件,所以我不能说真的。然后,您可以轻松地以docker-compose格式移植命令
关于docker - MockServer:模拟外部http/https响应会拒绝80/443上的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64169990/