【问题标题】:Getting "FATAL: role "root" does not exist" when trying to do "docker up"尝试执行“docker up”时获取“致命:角色“root”不存在”
【发布时间】:2016-10-24 13:19:32
【问题描述】:

我开始使用现有的使用 Docker 的 Rails 项目。我已经使用 Rails 很长时间了,但从未使用过 Docker。

在我执行docker build . 之后,我尝试执行docker-compose up,但我得到:

致命:角色“root”不存在 /usr/local/bundle/gems/activerecord-4.2.5.2/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `rescue in connect': FATAL: 角色“root”不存在(ActiveRecord::NoDatabaseError)

在我看来,Docker 机器可能正试图以root 用户身份连接到数据库,但没有名为root 的角色,所以连接失败了。

我不知道为什么 Docker 显然试图以 root 的身份连接到数据库,以及如何让它使用正确的用户。

这是我的database.yml

development:
  database: my_app_development
  adapter: postgresql
  encoding: unicode
  pool: 5

感谢任何帮助。

编辑:这是我的docker-compose.yml

web:
  build: .
  volumes:
    - .:/my_app
  ports:
    - "3000:3000"
  links:
    - postgres
    - redis
    - mailcatcher
  env_file:
    - 'config/application.yml'
postgres:
  image: postgres:9.4
  ports:
    - "5432"
  env_file:
    - 'config/database.yml'
redis:
  image: redis:3.0.6
mailcatcher:
  image: schickling/mailcatcher
  ports:
    - "1080:1080"

【问题讨论】:

  • 你的 docker-compose.yml 看起来怎么样?您是否为 postgres 使用单独的容器?
  • 嘿勒坎!我已经编辑了我的答案以包括docker-compose.yml。我不知道如何知道我是否在为 PostgreSQL 使用单独的容器。
  • 是的,杰斯!因此,您似乎正在使用与 docker-compose.yml 不同的容器。我认为您将使用 postgres 的 env vars 更新撰写文件。
  • 好的,谢谢。愚蠢的问题:我该怎么做?

标签: ruby-on-rails postgresql docker


【解决方案1】:

您可能希望按如下方式更新您的 compose 和数据库 yml。在database.yml 中使用预期的数据库用户和密码。此外,您可以将其设为环境变量。但请先尝试使用 postgres db docker 镜像的默认值,如下所示;

database.yml

development:
  database: my_app_development
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: postgres
  password:
  host: postgres(db name in docker-compose.yml)

docker-compose.yml

      web:
        build: .
        command: bundle exec rails s -p 3000 -b '0.0.0.0'
        volumes:
          - .:/my_app
        ports:
          - "3000:3000"
        links:
          - postgres
          - redis
          - mailcatcher
      postgres:
        image: postgres:9.4
        ports:
          - "5432"
      redis:
        image: redis:3.0.6
      mailcatcher:
        image: schickling/mailcatcher
        ports:
            - "1080:1080"

我不认为你想保留

   env_file:
      - 'config/database.yml'

   env_file:
      - 'config/application.yml'

然后用docker-compose run web rake db:create创建数据库

我添加了命令指令,因为我不知道你的Dockerfile 是什么样的。但是,如果您使用 docker build -t app-name . 成功构建了应用映像,则可以将其删除并运行 docker-compose up

【讨论】:

    【解决方案2】:

    Postgres 图像需​​要提供 POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DB。否则它将使用默认值。在项目根目录下创建.env文件:

    # .env file
    POSTGRES_USER=testuser
    POSTGRES_PASSWORD=testpass
    POSTGRES_DB=db_development
    

    并将docker-compose 文件更改为:

      web:
        build: .
        volumes:
          - .:/my_app
        ports:
          - 3000:3000
        depends_on:
          - postgres
          - redis
          - mailcatcher
      postgres:
        image: postgres:9.4
        ports:
          - 5432:5432
        env_file: .env
      redis:
        image: redis:3.0.6
      mailcatcher:
        image: schickling/mailcatcher
        ports:
          - 1080:1080
    

    你也可以提供不带.env文件的环境变量:

      web:
        build: .
        volumes:
          - .:/my_app
        ports:
          - 3000:3000
        depends_on:
          - postgres
          - redis
          - mailcatcher
      postgres:
        image: postgres:9.4
        ports:
          - 5432:5432
        environment:
          - POSTGRES_USER=testuser
          - POSTGRES_PASSWORD=testpass
          - POSTGRES_DB=db_development
      redis:
        image: redis:3.0.6
      mailcatcher:
        image: schickling/mailcatcher
        ports:
          - 1080:1080
    

    并更新您的database.yml 文件:

    default: &default
      adapter: postgresql
      encoding: unicode
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: <%= ENV['POSTGRES_USER'] %>
      password: <%= ENV['POSTGRES_PASSWORD'] %>
      host: postgres
    development:
      <<: *default
      database: db_development
    test:
      <<: *default
      database: db_test
    production:
      <<: *default
      database: db_production
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 25 } %>
    

    警告:请勿使用linksit'll be removed soon

    【讨论】:

      【解决方案3】:

      如果没有在 database.yml 中设置明确的用户,它将尝试使用 root 用户,因为这是在容器中运行 postgres 的同一用户。要解决此问题,请尝试将您的 database.yml 设置为:

      development:
        database: my_app_development
        adapter: postgresql
        encoding: unicode
        pool: 5
        username: postgres
      

      注意添加的用户名字段。

      【讨论】:

        【解决方案4】:

        使用 docker-compose,它会尝试在运行之间保留卷;由于用户仅在新数据库上创建,您可能需要 docker-compose rm -v database 删除容器和关联的卷。

        再试一次docker-compose up --build

        来源:https://github.com/docker-library/postgres/issues/41#issuecomment-167603905

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-02-18
          • 1970-01-01
          • 2017-03-08
          • 2018-09-18
          • 1970-01-01
          • 2014-09-22
          • 2015-03-28
          • 1970-01-01
          相关资源
          最近更新 更多