[英]Docker Compose: Mock external services
我有以下情況:
我的應用程序包含一個調用外部API的Web服務(比如一些SaaS服務,ElasticSearch等)。 對於非單元測試目的,我們希望控制外部服務,然后還要注入故障。 應用程序和“模擬”API是docker化的,現在我想使用docker docker-compose
來旋轉所有容器。
因為應用程序有幾個硬編碼的地址(例如外部服務的主機名),我無法改變它們並需要解決。
service
容器調用http://external-service.com/getsomestuff
。
我的想法是使用docker提供的一些功能將所有傳出流量重新路由到外部http://external-service.com/getsomestuff
到模擬容器而不更改URL。
我docker-compose.yaml
看起來像:
version: '2'
services:
service:
build: ./service
container_name: my-service1
ports:
- "5000:5000"
command: /bin/sh -c "python3 app.py"
api:
build: ./api-mock
container_name: my-api-mock
ports:
- "5001:5000"
command: /bin/sh -c "python3 app.py"
最后,我有一個驅動程序,只執行以下操作:
curl -XGET localhost:5000/
curl -XPUT localhost:5001/configure?delay=10
curl -XGET localhost:5000/
第二個curl
只是將模擬中的延遲設置為10秒。
我考慮過幾種選擇:
iptables
-fu(需要修改Dockerfiles來安裝它) 有沒有簡單的選擇來實現我想要的?
編輯 :
為清楚起見,這是service
代碼的相關部分:
import requests
@app.route('/')
def do_stuff():
r = requests.get('http://external-service.com/getsomestuff')
return process_api_response(r.text())
Docker為用戶定義的網絡運行內部DNS服務器。 任何未知的主機查找都會轉發給普通的DNS服務器。
版本2+撰寫文件將自動創建一個網絡供撰寫使用,因此有許多方法可以控制它解析的主機名。
最簡單的方法是使用主機名命名容器:
version: "2"
services:
external-service.com:
image: busybox
command: sleep 100
ping:
image: busybox
command: ping external-service.com
depends_on:
- external-service.com
如果要保留容器名稱,可以使用links
version: "2"
services:
api:
image: busybox
command: sleep 100
ping:
image: busybox
links:
- api:external-service.com
command: ping external-service.com
depends_on:
- api
或網絡別名
version: "2"
services:
api:
image: busybox
command: sleep 100
networks:
pingnet:
aliases:
- external-service.com
ping:
image: busybox
command: ping external-service.com
depends_on:
- api
networks:
- pingnet
networks:
pingnet:
我不太清楚你要解決的問題是什么,但是如果你想讓容器內的external-service.com
直接流向你的“模擬”服務,我認為你應該可以做到在docker docker-compose.yml
文件中使用extra_hosts指令。 例如,如果我有這個:
version: "2"
services:
example:
image: myimage
extra_hosts:
- google.com:172.23.254.1
這將導致容器中的/etc/hosts
包含:
172.23.254.1 google.com
嘗試訪問http://google.com
將嘗試訪問我的網絡服務器172.23.254.1。
我能用-links來解決這個問題,有沒有辦法在docker-compose中做網絡?
版本:'3'
服務:
MOCK:
image: api-mock:latest
container_name: api-mock-container
ports:
- "8081:80"
api:
image: my-service1:latest
links:
- MOCK:external-service.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.