【问题标题】:Mongo authentication inside DockerDocker 内部的 Mongo 身份验证
【发布时间】:2018-11-27 22:30:42
【问题描述】:

我正在尝试通过身份验证运行 mongo docker 映像。按照documentation 中最简单的示例,我通过docker-compose up 命令运行了mongo 和mongo-express 图像。我的docker-compose.yml现阶段:

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

这运行,两个容器都启动正常,我可以从 mongo-express 网站浏览 mongo 的内容。但是,每当我更改 docker-compose.yml 文件中的用户名或密码时,例如:

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example123

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example123

mongo-express 抛出未经授权的错误消息:

mongo-express_1  | Admin Database connected
mongo-express_1  | { MongoError: Authentication failed.
mongo-express_1  |     at Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:31:11)
mongo-express_1  |     at /node_modules/mongodb-core/lib/connection/pool.js:483:72
mongo-express_1  |     at authenticateStragglers (/node_modules/mongodb-core/lib/connection/pool.js:429:16)
mongo-express_1  |     at Connection.messageHandler (/node_modules/mongodb-core/lib/connection/pool.js:463:5)
mongo-express_1  |     at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:319:22)
mongo-express_1  |     at emitOne (events.js:116:13)
mongo-express_1  |     at Socket.emit (events.js:211:7)
mongo-express_1  |     at addChunk (_stream_readable.js:263:12)
mongo-express_1  |     at readableAddChunk (_stream_readable.js:250:11)
mongo-express_1  |     at Socket.Readable.push (_stream_readable.js:208:10)
mongo-express_1  |   name: 'MongoError',
mongo-express_1  |   message: 'Authentication failed.',
mongo-express_1  |   ok: 0,
mongo-express_1  |   errmsg: 'Authentication failed.',
mongo-express_1  |   code: 18,
mongo-express_1  |   codeName: 'AuthenticationFailed' }
mongo-express_1  | unable to list databases
mongo-express_1  | { MongoError: command listDatabases requires authentication
mongo-express_1  |     at Function.MongoError.create (/node_modules/mongodb-core/lib/error.js:31:11)
mongo-express_1  |     at /node_modules/mongodb-core/lib/connection/pool.js:483:72
mongo-express_1  |     at authenticateStragglers (/node_modules/mongodb-core/lib/connection/pool.js:429:16)
mongo-express_1  |     at Connection.messageHandler (/node_modules/mongodb-core/lib/connection/pool.js:463:5)
mongo-express_1  |     at Socket.<anonymous> (/node_modules/mongodb-core/lib/connection/connection.js:319:22)
mongo-express_1  |     at emitOne (events.js:116:13)
mongo-express_1  |     at Socket.emit (events.js:211:7)
mongo-express_1  |     at addChunk (_stream_readable.js:263:12)
mongo-express_1  |     at readableAddChunk (_stream_readable.js:250:11)
mongo-express_1  |     at Socket.Readable.push (_stream_readable.js:208:10)
mongo-express_1  |   name: 'MongoError',
mongo-express_1  |   message: 'command listDatabases requires authentication',
mongo-express_1  |   ok: 0,
mongo-express_1  |   errmsg: 'command listDatabases requires authentication',
mongo-express_1  |   code: 13,
mongo-express_1  |   codeName: 'Unauthorized' }

无论我在docker-compose.yml 中输入什么用户名或密码,我都无法让mongo-express 连接到mongo,除非我使用原始的rootexample 对。

请注意,我没有将用户名和密码作为环境变量,而是直接输入到docker-compose.yml 文件中,如您在此处看到的。

另外请注意,当我将 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD(mongo 的)变量更改为任何内容时,它们似乎没有效果,我仍然可以使用原始根和示例凭据连接 mongo-express .

是什么导致了这种行为?我怎样才能使这项工作?

【问题讨论】:

  • 我的猜测:INITDB 变量仅用于初始化,因此如果 DB 已经初始化,则不会使用它们。尝试销毁,然后从头开始你的堆栈,你会看到。
  • 我尝试运行 docker-compse up --build --force-recreate 并没有解决这个问题。
  • 作为一个绝望的尝试,我删除了所有相关的容器和图像。在这种情况下,我第一次可以使用任何用户名和密码,所以您可能对 INITDB 变量是正确的,但我仍然不知道为什么会发生这种情况。

标签: mongodb docker docker-compose


【解决方案1】:

你的 docker-compose 命令:

docker-compose up --build --force-recreate    

Mongo 图片uses anonymous volumes,所以你还需要--renew-anon-volumesdoc):

docker-compose up --build --force-recreate --renew-anon-volumes

否则将使用已初始化 DB 的先前卷 => 不会使用 INITDB 环境变量。

【讨论】:

  • --renew-anon-volumes 标志解决了我的问题,谢谢!
【解决方案2】:

对我有用的只是为 mongodb 服务器添加环境变量。

ME_CONFIG_MONGODB_SERVER: mongo

像这样:

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_SERVER: mongo

【讨论】:

  • 这是给我的,已经有一段时间了,似乎默认主机在某个时候被删除了。
  • 这太疯狂了,因为在 mongo-express docker 页面中它说默认是 mongo 但显然也需要提供它
  • ME_CONFIG_MONGODB_SERVER 是 mongodb 容器名,而不是主机名。
【解决方案3】:

如果您创建 mongodb 容器(docker-compose up 将构建/拉取映像并启动一个容器)并为其提供用户名和密码,那么 mongodb 将在第一次运行时自行配置并且再也不会!在您为该服务创建新容器之前,默认用户/通行证将是最初设置的用户/通行证。如果要更改默认值,则必须创建一个新容器。 您也可以在容器启动后添加用户。

仅停止服务容器 (docker-compose stop) 不会破坏 de 容器。为此,请调用 docker-compose down 或在启动时调用 docker-compose up --force-recreate

问候

【讨论】:

    【解决方案4】:

    就我而言,我必须先停止所有容器。

    然后docker system prune -a --volumes

    ⚠️这是最后的手段。在使用此命令之前检查the docker doc

    【讨论】:

      【解决方案5】:

      docker system prune -a --volumes 可以解决这个问题,但更简单的方法是(如果您要为 db 安装数据卷以保持持久性),您可以删除并重新创建一个新卷,这样其他卷将保持不变。 当然,将它与:docker-compose up --build --force-recreate --renew-anon-volumes

      【讨论】:

        猜你喜欢
        • 2021-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 2022-01-10
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        相关资源
        最近更新 更多