簡體   English   中英

無法連接本地 mongoDb docker 數據庫

[英]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數據庫

這不應該是您的連接字符串的一部分嗎?

MONGODB_DATABASE

mongo 數據庫的 dockerfile 應該有某種創建數據庫NewsGroup的 db init 腳本

重啟策略:

我猜這兩個服務幾乎同時剝離 Web API 很容易,而且可能會更快到達那里。 MongoDB 需要更長的時間。 那時 WebAPI 已經崩潰了。 一個骯臟的技巧是在writer.api -compose 中添加重啟策略

restart: on-failure

更好的方法是在 Dockerfile 中為編寫器 API 編寫腳本,使其等待mongodbService出現

編輯 #1:

跨不同服務的自定義網絡:

...
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM