![](/img/trans.png)
[英]Unable to connect to local MongoDB docker cluster with Compass
[英]Unable to connect ot local mongoDb docker database
我在從 dotnet core 3.1 應用程序連接到 mongoDb 時遇到問題。 mongoDb 和 API 應用程序都在容器內運行。 每個容器都可以從本地主機訪問,它們使用默認的 docker 網絡設置。
我的 mongoDb docker-compose 文件
version: "3.4"
services:
mongoDatabase:
restart: always
image: mongo:latest
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=rootPassword
volumes:
- ./mongoDatabase:/data/db
ports:
- "27017:27017"
我的應用程序 docker-compose 文件
writer.api:
image: ${DOCKER_REGISTRY-}writerapi
build:
context: .
dockerfile: Services/Writer/Writer.API/Dockerfile
environment:
- MONGODB_CONNECTION=mongodb://root:rootPassword@host.docker.internal:27017/NewsGroup
- MONGODB_DATABASE="NewsGroup"
- MONGODB_COLLECTION_NAME="News"
ports:
- "10020:80"
它們背后的原因都在一個 compose 文件中,因為在該 compose 文件中運行着更多的服務。
我的代碼遵循Microsoft 提供的 mongodb docs 。 代碼如下:
public class MongoDatabaseService : IMongoDatabaseService
{
private IMongoDatabase _context;
private IMongoCollection<ArticleGroup> _articleGroup;
public MongoDatabaseService()
{
string mongoConnectionString = Environment.GetEnvironmentVariable("MONGODB_CONNECTION");
if (string.IsNullOrEmpty(mongoConnectionString))
{
throw new Exception("MongoConnectionstring is empty");
}
string mongoDatabase = Environment.GetEnvironmentVariable("MONGODB_DATABASE");
if (string.IsNullOrEmpty(mongoDatabase))
{
throw new Exception("MongoDatabase name is empty");
}
var client = new MongoClient(mongoConnectionString);
_context = client.GetDatabase(mongoDatabase);
string collectionName = Environment.GetEnvironmentVariable("MONGODB_COLLECTION_NAME");
if (string.IsNullOrEmpty(mongoDatabase))
{
throw new Exception("MongoDatabase collection is empty");
}
_articleGroup = _context.GetCollection<ArticleGroup>(collectionName);
}
public void AddArticleGroup(ArticleGroup newGroup)
{
_articleGroup.InsertOne(newGroup);
}
}
在插入操作期間,我收到以下異常
MongoDB.Driver.MongoAuthenticationException: 'Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1.'
MongoCommandException: Command saslStart failed: Authentication failed..
我還安裝了一個可視化客戶端來查看實際操作,我可以確認指定的數據庫/集合是否存在並且用戶可以訪問。
有誰知道這個問題的原因是什么?
一些想法..
mongo數據庫
這不應該是您的連接字符串的一部分嗎?
mongo 數據庫的 dockerfile 應該有某種創建數據庫NewsGroup
的 db init 腳本
我猜這兩個服務幾乎同時剝離 Web API 很容易,而且可能會更快到達那里。 MongoDB 需要更長的時間。 那時 WebAPI 已經崩潰了。 一個骯臟的技巧是在writer.api
-compose 中添加重啟策略
restart: on-failure
更好的方法是在 Dockerfile 中為編寫器 API 編寫腳本,使其等待mongodbService
出現
...
movieapi:
build:
context: .
dockerfile: Dockerfile.api
restart: always
ports:
- "9000:80"
depends_on:
- moviedb
networks:
public_net:
ipv4_address: ${MVCMOVIE_API_1_IP}
...
networks:
public_net:
driver: bridge
ipam:
driver: default
config:
- subnet: ${NETWORK_SUBNET}
...
.env 文件:
COMPOSE_PROJECT_NAME=app_name
MVCMOVIE_EXPOSED_PORT=80
MVCMOVIE_API_1_IP=192.168.0.10
MVCMOVIE_WEB_1_IP=192.168.0.20
MVCMOVIE_WEB_2_IP=192.168.0.21
MVCMOVIE_DB_1_IP=192.168.0.30
HA_PROXY_IP=192.168.0.99
NETWORK_SUBNET=192.168.0.0/24
這里的問題是我在環境變量周圍添加了一個額外的“”,因此它正在尋找不存在的“NewsGroup”數據庫。 在我刪除了額外的“”之后,它按預期工作。
所以最終的docker環境變量是
writer.api:
image: ${DOCKER_REGISTRY-}writerapi
build:
context: .
dockerfile: Services/Writer/Writer.API/Dockerfile
environment:
- MONGODB_CONNECTION=mongodb://root:rootPassword@host.docker.internal:27017/NewsGroup
- MONGODB_DATABASE=NewsGroup
- MONGODB_COLLECTION_NAME=News
ports:
- "10020:80"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.