我开始使用现有的使用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"
答案 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_USER
,POSTGRES_PASSWORD
和POSTGRES_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 } %>
警告:请勿使用links
,it'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