ruby-on-rails - 带有 docker-compose 的 Rails 应用程序无法读取 .env 文件

标签 ruby-on-rails ruby postgresql docker docker-compose

我正在尝试运行使用 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/

相关文章:

ruby-on-rails - 如何序列化和反序列化邮件程序?

ruby-on-rails - Rails - 简单形式 :collection 中默认选择的单选按钮

ruby-on-rails - RESTful 路径是否适合 session 设置?

database - 从坐标 POSTGIS 创建的线串

postgresql - postgres 中的序列号正在增加,即使我添加了冲突什么都不做

javascript - 如何将 javascript 变量传递到 Rails Controller 中?

ruby - ActiveRecord 和 has_one & has_many 的使用

ruby-on-rails - 如何在 Sass 中使用 Ruby/Rails 变量?

ruby-on-rails - 无法使用 shoulda 匹配器获得唯一性验证测试通过

mysql - 无法连接到AWS VPC RDS实例(mysql或postgres)