簡體   English   中英

帶有 docker-compose 的 Rails 應用程序不讀取 .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"]

我嘗試解決此問題的其他一些要點:

  • 我已經在我的web容器中啟動了一個交互式byebug會話,並且可以確認我的 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 進行身份驗證,但就是無法正常工作。 我可能在這里遺漏了一些明顯的東西,所以我會喜歡另一雙👀

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

你有

password: ENV["POSTGRES_PASSWORD"]

你需要

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM