Neo4J Docker身份验证为什么无法工作?

18

我想通过docker-compose在docker中运行一个Neo4J实例。

docker-compose.yml

version: '3'
services:
  neo4j:
    container_name: neo4j-lab
    image: neo4j:latest
    environment:
      - NEO4J_dbms_memory_pagecache_size=2G
      - NEO4J_dbms_memory_heap_maxSize=4G
      - NEO4J_dbms_memory_heap_initialSize=512M
      - NEO4J_AUTH=neo4j/changeme
    ports:
      - 7474:7474
      - 7687:7687
    volumes:
      - neo4j_data:/data
      - neo4j_conf:/conf
      - ./import:/import
volumes:
  neo4j_data:
  neo4j_conf:

使用 docker-compose up 运行以下内容是完全可以的,并且我可以访问登录界面。

但是当我设置凭据时,在容器日志中会出现以下错误:Neo.ClientError.Security.Unauthorized The client is unauthorized due to authentication failure. 而我确信我填写了正确的凭据(与我的 docker-compose 文件中使用的凭据相同)

此外,

  • 当我将NEO4J_AUTH设置为none时,不会要求输入凭据。

  • 当我将其设置为neo4j/neo4j时,则会说我不能使用默认密码

根据文档,这是完全正常的:

默认情况下,Neo4j 需要身份验证,要求您在第一次连接时使用 neo4j/neo4j 登录并设置新密码。 您可以通过在运行指令中指定 --env NEO4J_AUTH=neo4j/password 直接为 Docker 容器设置密码。或者,通过指定 --env NEO4J_AUTH=none 来禁用身份验证。

你有任何想法是怎么回事吗?

希望您能帮助我解决问题!

编辑

Docker 日志输出:

neo4j-lab | 2019-03-13 23:02:32.378+0000 INFO  Starting...
neo4j-lab | 2019-03-13 23:02:37.796+0000 INFO  Bolt enabled on 0.0.0.0:7687.
neo4j-lab | 2019-03-13 23:02:41.102+0000 INFO  Started.
neo4j-lab | 2019-03-13 23:02:43.935+0000 INFO  Remote interface available at http://localhost:7474/
neo4j-lab | 2019-03-13 23:02:56.105+0000 WARN  The client is unauthorized due to authentication failure.

编辑2:

看起来先删除关联的卷会奏效。现在已经更改了密码。

但是,如果我运行docker-compose down 然后在我更改docker-compose文件中的密码后运行docker-compose up,问题会再次出现。

因此,我认为当我们通过docker-compose 多次更改密码时,只要存在一个卷,我们就需要删除卷中存在的auth文件。

做法如下:

docker volume inspect <volume_name>

你应该得到类似于这样的东西:

[
    {
        "CreatedAt": "2019-03-14T11:17:08+01:00",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "neo4j",
            "com.docker.compose.volume": "neo4j_data"
        },
        "Mountpoint": "/data/docker/volumes/neo4j_neo4j_data/_data",
        "Name": "neo4j_neo4j_data",
        "Options": null,
        "Scope": "local"
    }
]

如果您的容器和卷的命名不像我一样(neo4j,neo4j_data),那么情况显然是不同的。

重要的部分是Mount point,它定位了卷。

在此卷中,您可以删除位于dbms目录中的auth文件。

然后重新启动您的Docker,一切都应该没问题了。


Docker logs 输出是什么? - Mostafa Hussein
2
似乎启动了包含旧数据的容器,其中密码不是 changeme - Mostafa Hussein
1
我终于找到了问题的原因,让你看看我的第二次编辑。 :) - Dralucas
1
@Dralucas,您的帖子让我停止了6小时的头痛,因为我的密码无法被接受。我在Neo文档中没有看到任何提到您上面解释的内容。非常感谢! - Laurent S
我原本希望这可以为我解决问题,但是没有。 https://github.com/neo4j/docker-neo4j/issues/238 - dcsan
显示剩余5条评论
2个回答

16

我是一名Neo4j Docker开发者。

出现这种情况的原因是NEO4J_AUTH环境变量没有设置数据库密码,它只设置了初始密码。

如果您挂载了一个包含现有数据库的数据卷,那么NEO4J_AUTH将不起作用,因为该数据库已经有一个密码。听起来这就是你在这里遇到的问题。

关于此功能的文档不太好,我已经更新了它!请参见:Neo4j docker身份验证文档


如何在设置初始密码后,通过修改认证文件来重置密码?如果文档中能提供一些详细信息就太好了 @jenny - prrao
在Docker中运行时,有没有办法停止第一次登录时更改密码的要求? - SteveR

2

define Neo4j password with docker-compose

neo4j:
   image: 'neo4j:4.1'
   environment:
      NEO4J_AUTH: 'neo4j/your_password'
   ports:
      - "7474:7474"
   volumes:
      ...

当容器内部进行密码更改时,会出现问题。通过 docker-compose 提供密码会使其变成静态密码。 - Wander3r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接