【发布时间】:2022-07-03 16:53:10
【问题描述】:
我试图运行 sudo docker-compose up 来让我的应用程序运行并连接到本地主机 mongodb,但我遇到了这个错误
time="2021-12-28T08:31:54Z" level=fatal msg="server selection error: context deadline exceeded, current topology: { Type: Unknown, Servers: [{ Addr: host.docker.internal:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup host.docker.internal: no such host }, ] }"
最初,我尝试将 localhost 替换为 host.docker.internal,而不是让 mongo uri 连接到 docker 网络,但它似乎无法找到它。我也是最新版本的docker,所以不是docker版本不支持的问题。
docker-compose.yaml
version: '3.3'
services:
app:
build:
context: .
dockerfile: dockerfile
ports:
- "8080:20717"
restart: unless-stopped
env_file: .env
networks:
- ext
- int
networks:
ext:
int:
internal: true
我之前有一个 extra_hosts 部分,但用 networks 部分替换了它。
extra_hosts:
- "host.docker.internal:127.0.0.1"
我的.env 文件包含应用程序的 URI 和其他一些必要变量
DB_URI=mongodb://host.docker.internal:27017
CITY_DB=nht_cities
COL_USER=user
COL_CITY=city
USER_AUTH_TOKEN=50dbafa...
我的应用程序本身在端口 8080 上运行
fmt.Println("Server running at port 8080")
log.Fatal(http.ListenAndServe(":8080", r)) // r being the router
【问题讨论】:
-
您的主机操作系统是什么?你也可以在容器中运行 MongoDB 实例吗?
-
我使用 Linux (Zorin OS)。我该怎么做?为什么会有帮助?
-
您可以将基于the
mongoimage 的容器添加到您的docker-compose.yml文件中。如果你这样做了,那么你可以使用 Compose 服务名作为主机名,而不用试图弄清楚如何从 Docker 中调用回主机。另请参阅 Docker 文档中的 Networking in Compose。 -
所以,我尝试让数据库作为图像而不是在本地主机上运行。我将
DB_URI替换为包含db作为服务名称,而不是host.docker.internal。执行docker-compose up似乎可以使其正常工作,尽管它会向我抛出一些奇怪的错误。但是在 docker playground 上运行它会给我一个找不到主机的错误。我可以将它们编辑到问题中,但上次我尝试过时,所有 cmets 都消失了。