Rails 具有 docker-compose 的应用无法读取 .env 文件

Rails app with docker-compose does not read .env file

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

我尝试解决此问题时的其他几点:

[...]
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: admin
[...]

tl;dr 我觉得在使用 docker-compose 时我已经尝试了几乎所有方法来让 Rails 向 Postgres 进行身份验证,但只是无法正常工作。我可能在这里遗漏了一些明显的东西所以我想要另一双

您忘记在 database.yml 上用 <%= %> 包裹 ENV["POSTGRES_PASSWORD"]

你有

password: ENV["POSTGRES_PASSWORD"]

你需要

password: <%= ENV["POSTGRES_PASSWORD"] %>