Rails/PostgreSQL - PG::ConnectionBad:致命:用户密码验证失败(CI/CD)
Rails/PostgreSQL - PG::ConnectionBad: FATAL: password authentication failed for user (for CI/CD)
首先,我知道这个问题是有答案的:
- Rails: FATAL - Peer authentication failed for user (PG::Error)
但在任何情况下,您都必须手动完成,我想找到一个可以在我的 CI/CD 管道上自动完成以部署到生产中的答案。
我得到的错误是这样的:
FATAL: password authentication failed for user "Jenkins_project"
Couldn't create 'Jenkins_project_production' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: FATAL: password authentication failed for user "Jenkins_project"
当我尝试创建和迁移数据库时发生这种情况:
docker-compose -f docker-compose.override.yml --env-file .env run web rake db:create db:migrate
我使用 -f docker-compose.override.yml
因为我试图将它部署在 AWS EC2 服务器中。 docker-compose.override.yml
看起来像这样:
version: "3"
services:
db:
image: postgres
environment:
POSTGRES_USER: ${POSTGRES_USER:-default}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
POSTGRES_USER: ${POSTGRES_USER:-default}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
POSTGRES_HOST: ${POSTGRES_HOST:-default}
JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}
并且它连接到 .env
文件,所以这就是我在 docker-compose
命令上调用 --env-file .env
的原因。
.env
看起来像这样:
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_HOST=host
JENKINS_PROJECT_DATABASE_PASSWORD=jenkins_password
我的 database.yml
看起来像这样:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: user
password: password
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: Jenkins_project_development
production:
<<: *default
database: Jenkins_project_production
username: Jenkins_project
password: <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>
我想做的是在 运行 命令时将 .env
文件“秘密”传递给 docker-compose.override.yml
上的每个服务,然后从那里填充 <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>
在 database.yml
.
看来我做错了什么,但我不知道是什么。
同样,我知道我可以手动执行此操作,但我想让它自动部署 CI/CD 管道。
如果有人有任何想法,请分享。谢谢!
通过从生产中删除 username
和 password
并保留默认值来解决此问题:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: user
password: password
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: Jenkins_project_development
production:
<<: *default
database: Jenkins_project_production
首先,我知道这个问题是有答案的:
- Rails: FATAL - Peer authentication failed for user (PG::Error)
但在任何情况下,您都必须手动完成,我想找到一个可以在我的 CI/CD 管道上自动完成以部署到生产中的答案。
我得到的错误是这样的:
FATAL: password authentication failed for user "Jenkins_project"
Couldn't create 'Jenkins_project_production' database. Please check your configuration.
rake aborted!
PG::ConnectionBad: FATAL: password authentication failed for user "Jenkins_project"
当我尝试创建和迁移数据库时发生这种情况:
docker-compose -f docker-compose.override.yml --env-file .env run web rake db:create db:migrate
我使用 -f docker-compose.override.yml
因为我试图将它部署在 AWS EC2 服务器中。 docker-compose.override.yml
看起来像这样:
version: "3"
services:
db:
image: postgres
environment:
POSTGRES_USER: ${POSTGRES_USER:-default}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}
volumes:
- ./tmp/db:/var/lib/postgresql/data
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
POSTGRES_USER: ${POSTGRES_USER:-default}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-default}
POSTGRES_HOST: ${POSTGRES_HOST:-default}
JENKINS_PROJECT_DATABASE_PASSWORD: ${JENKINS_PROJECT_DATABASE_PASSWORD:-default}
并且它连接到 .env
文件,所以这就是我在 docker-compose
命令上调用 --env-file .env
的原因。
.env
看起来像这样:
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_HOST=host
JENKINS_PROJECT_DATABASE_PASSWORD=jenkins_password
我的 database.yml
看起来像这样:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: user
password: password
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: Jenkins_project_development
production:
<<: *default
database: Jenkins_project_production
username: Jenkins_project
password: <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>
我想做的是在 运行 命令时将 .env
文件“秘密”传递给 docker-compose.override.yml
上的每个服务,然后从那里填充 <%= ENV['JENKINS_PROJECT_DATABASE_PASSWORD'] %>
在 database.yml
.
看来我做错了什么,但我不知道是什么。 同样,我知道我可以手动执行此操作,但我想让它自动部署 CI/CD 管道。
如果有人有任何想法,请分享。谢谢!
通过从生产中删除 username
和 password
并保留默认值来解决此问题:
default: &default
adapter: postgresql
encoding: unicode
host: db
username: user
password: password
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: Jenkins_project_development
production:
<<: *default
database: Jenkins_project_production