我正在使用一個簡單的 go CRUD api,它使用 MongoDB 并將其移動到 docker 容器。由于某種原因,我無法連接到 MongoDB。經過研究,我找不到解決方案。我試過了:公開/發布端口,因此我可以在嘗試連接到客戶端時使用容器名稱而不是 'mongodb:localhost:27017/'。我還刪除了 compose.yml 文件中的所有網絡配置,以免網絡混亂。這是我的 compose.yml 文件:version: '3.4' services: mongodb: image: mongo:4.0.4 restart: always ports: - 27017:27017 mongo_todo: build: ./mongo_todo ports: - 3000:3000 depends_on: - mongodb go_todo: build: ./go_todo ports: - 80:80 depends_on: - mongo_todo這是我的 mongo_todo Dockerfile:FROM golang:1.14WORKDIR /go/src/appCOPY . .RUN go get -d -v ./...RUN go install -v ./...EXPOSE 80這就是我嘗試連接到客戶端的方式:// Set client optionsclientOptions := options.Client().ApplyURI("mongodb://mongodb:27017")// Connect to MongoDBClient, _ = mongo.Connect(context.TODO(), clientOptions)// Check the connectionerr := Client.Ping(context.TODO(), nil)if err != nil { log.Fatal(err)}該程序在嘗試 ping 客戶端以檢查連接時記錄一個致命錯誤。日志輸出:panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x2e0 pc=0x9a798c]goroutine 1 [running]:go.mongodb.org/mongo-driver/mongo.(*Client).Ping(0x0, 0xd61e20, 0xc000028030, 0x0, 0x1, 0x0)/go/src/go.mongodb.org/mongo-driver/mongo/client.go:229 +0x21cmain.main()/go/src/app/main.go:30 +0x16f我知道這是某種網絡問題,但我不知道為什么它不起作用,我覺得我缺少一些簡單的東西。如果需要,請向我詢問更多信息,并提前感謝您的幫助。編輯:我可以從我的 go_todo 容器中 ping 主機名 mongodb,所以不確定這是否是網絡問題。
3 回答

回首憶惘然
TA貢獻1847條經驗 獲得超11個贊
是的,這在使用 docker-compose 時有點令人困惑(閱讀:煩人)。
調用的服務mongodb
不是您設置的容器名稱ApplyURI
。docker-compose 為容器名稱添加一個“項目名稱”前綴。
運行 adocker ps
并查找列“ NAMES ”(應該是最后一個)。使用 mongodb 實例的名稱作為 URI 主機,它應該可以連接。

蕪湖不蕪
TA貢獻1796條經驗 獲得超7個贊
您應該調試代碼并檢查哪個對象是 Nil。也許您正在調用 Nil 對象的方法。
我會建議您顯式創建一個Docker network
MongoDB docker 實例和應用程序并將其附加到它。然后使用容器名稱訪問您的 MongoDB。我也遇到了連接問題,我使用Docker network
.
正如@CenterOrbit建議的那樣,明確命名您的容器,否則 docker 會給它一個隨機名稱,您將無法連接到 MongoDB。

GCT1015
TA貢獻1827條經驗 獲得超4個贊
我是如此愚蠢,顯然是一個碼頭菜鳥。
我以為docker-compose up
重建了我的容器映像,但它沒有,所以我的更改沒有被使用。
謝謝你的評論,雖然我很感激!
- 3 回答
- 0 關注
- 199 瀏覽
添加回答
舉報
0/150
提交
取消