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"]
我尝试解决此问题时的其他几点:
- 我已经在我的
web
容器中启动了一个交互式 byebug
会话,并且可以确认我的 Rails 应用程序(运行ning 在 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 我觉得在使用 docker-compose 时我已经尝试了几乎所有方法来让 Rails 向 Postgres 进行身份验证,但只是无法正常工作。我可能在这里遗漏了一些明显的东西所以我想要另一双
您忘记在 database.yml
上用 <%= %>
包裹 ENV["POSTGRES_PASSWORD"]
。
你有
password: ENV["POSTGRES_PASSWORD"]
你需要
password: <%= ENV["POSTGRES_PASSWORD"] %>
我正在尝试 运行 使用 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 应用程序(运行ning 在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 我觉得在使用 docker-compose 时我已经尝试了几乎所有方法来让 Rails 向 Postgres 进行身份验证,但只是无法正常工作。我可能在这里遗漏了一些明显的东西所以我想要另一双
您忘记在 database.yml
上用 <%= %>
包裹 ENV["POSTGRES_PASSWORD"]
。
你有
password: ENV["POSTGRES_PASSWORD"]
你需要
password: <%= ENV["POSTGRES_PASSWORD"] %>