我正在尝试运行使用 docker-compose 在本地构建的 Rails 应用程序。我想将所有配置变量保留在 .env
中,并让 docker-compose 从此文件中读取。然而,当我尝试这样做时,我不断遇到错误:
ActiveRecord::ConnectionNotEstablished (FATAL: password authentication failed for user "postgres")
我的 docker-compose 文件如下所示:
version: "3.9"
services:
db:
container_name: postgres
image: postgres
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
env_file:
- ".env"
web:
container_name: puma
stdin_open: true
tty: true
build:
context: .
dockerfile: Dockerfile
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
env_file:
- ".env"
ports:
- "3000:3000"
depends_on:
- db
volumes:
postgres-data:
当我运行docker-compose config
时,我可以看到docker-compose正在正确读取我设置的POSTGRES_PASSWORD
配置:
$ docker-compose config
services:
db:
container_name: postgres
environment:
POSTGRES_PASSWORD: admin
image: postgres
[...]
我的.env
位于项目目录的根目录,就像docker-compose.yml
一样,看起来像这样(减去另外两个已编辑的键值对在这里):
POSTGRES_PASSWORD=admin
最后,我的 database.yml
文件如下所示:
default: &default
adapter: postgresql
encoding: unicode
database: myapp_db
host: db
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
username: postgres
password: ENV["POSTGRES_PASSWORD"]
我尝试解决此问题的其他一些要点:
- 我已在
web
容器中启动了交互式byebug
session ,并且可以确认我的 Rails 应用(在web
中运行)容器返回正确的POSTGRES_PASSWORD
值。 - 当我显式设置
docker-compose.yml
以包含密码(如下所示)时,应用程序可以很好地向数据库进行身份验证。也就是说,我真的更喜欢使用.env
文件,即使对于测试和开发用例也是如此:
[...]
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: admin
[...]
- 我正在使用
dotenv
gem 将环境变量加载到 Rails 中。 - 我曾多次尝试拆除(通过 docker-compose down --volumes)并重建容器(`docker-compose build --no-cache)以使其正常工作 - 但没有成功。
tl;dr 👉 我觉得我已经尝试了几乎所有方法来让 Rails 在使用 docker-compose 时向 Postgres 进行身份验证,但就是无法让它工作。我可能在这里遗漏了一些明显的东西,所以我想要另一双👀
最佳答案
你忘了包装ENV["POSTGRES_PASSWORD"]
与 <%= %>
关于database.yml
.
你有
password: ENV["POSTGRES_PASSWORD"]
你需要
password: <%= ENV["POSTGRES_PASSWORD"] %>
关于ruby-on-rails - 带有 docker-compose 的 Rails 应用程序无法读取 .env 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72193214/