我有一个在本地运行的容器
docker run \
--publish 8081:8081 \
--publish 10250-10255:10250-10255 \
--interactive \
--tty \
mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest
我可以在 Chrome 中正常运行,https://localhost:8081/etc/etc。
但是我现在必须编写一个 Go 程序来对正在运行的容器进行 API 调用。我得到:
Post "https://172.17.0.2:8081/dbs": dial tcp 172.17.0.2:8081: connect: no route to host
我在这里遗漏了什么吗?我需要进一步公开端口吗?
package main
import (
"context"
"log"
"github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)
func main() {
const (
cosmosDbEndpoint = "https://localhost:8081/"
cosmosDbKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
dbname = "db5"
)
cred, err := azcosmos.NewKeyCredential(cosmosDbKey)
handle(err)
client, err := azcosmos.NewClientWithKey(cosmosDbEndpoint, cred, nil)
handle(err)
databaseProperties := azcosmos.DatabaseProperties{ID: dbname}
_, err = client.CreateDatabase(context.Background(), databaseProperties, nil)
handle(err)
}
尝试跑步
set http_proxy=
set https_proxy=
请注意,您必须导入证书,如下所示 卷曲 -k https://localhost:8081/_explorer/emulator.pem > ~/emulatorcert.crt 然后例如在 Mac 中转到钥匙串,添加证书并信任它
如果您从与模拟器位于同一网络上的 Docker 容器运行代码(并使用适当的地址),则您的代码将可以工作。要从主机访问它,您需要使用
AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE
覆盖模拟器 IP 地址,即
docker run -e AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=127.0.0.1 --publish 8081:8081 --publish 10250-10255:10250-10255 --interactive --tty mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest
如果没有此设置,模拟器将告诉客户端连接到其 docker 分配的 IP(无法从主机访问)。