尝试“停靠”时,“致命:角色”根“不存在”

时间:2016-06-22 14:16:56

标签: ruby-on-rails postgresql docker

我开始使用现有的使用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救援连接':致命:角色“根”不存在(ActiveRecord :: NoDatabaseError)< / p>

在我看来,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"

4 个答案:

答案 0 :(得分:3)

您可能希望更新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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

请注意添加用户名字段。

答案 3 :(得分:0)

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

再次尝试docker-compose up --build

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