我真的需要一些帮助。我是 Ruby on Rails 新手。我正在使用 postresql 和 docker 构建一个 Rails 7.1.0 应用程序。我正在 Pop!_OS 22.04 LTS 计算机上工作 安装了 ruby 3.2.2(2023-03-30 修订版 e51014f9c0)[x86_64-linux] 和 psql (PostgreSQL) 16.0 (Ubuntu 16.0-1.pgdg22.04+1)。 当我运行命令“docker-compose build”后,编译过程一切顺利。
但是当我尝试运行“docker-compose up”时,它一直说 bin/rails 中止! 解析 /rails/config/database.yml 时发生 YAML 语法错误。请注意,YAML 必须始终使用空格缩进。不允许使用制表符。错误:():在第 14 行第 13 列扫描下一个标记时发现无法启动任何标记的字符
这就是我尝试过的。
在我使用“docker-compose build”构建应用程序后。我在终端中运行了命令“docker-compose up”。我期望使用 docker 启动服务器,以便我可以在浏览器中的“localhost:3000”地址启动应用程序。但我却得到了相反的结果。
我的终端显示以下内容:
sharkphonesuniverse-demo-web-1 | YAML syntax error occurred while parsing /rails/config/database.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Error: (<unknown>): found character that cannot start any token while scanning for the next token at line 14 column 13
**********************************************
Here is the content of my database.yml
**********************************************
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: <%= ENV['POSTGRES_HOST'] %>
port: 5432
development:
<<: *default
database: sharkphonessale_development
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
test:
<<: *default
database: sharkphonessale_test
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
production:
<<: *default
database: <%= ENV['POSTGRES_DB'] %>
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
**********************************************
The contents of my .env file
**********************************************
RAILS_ENV=production
POSTGRES_HOST=db
POSTGRES_DB=demodb_production
POSTGRES_USER=my db username goes here
POSTGRES_PASSWORD=my db password goes here
RAILS_MASTER_KEY=I paste the content of my config > master.key file here
N.B. I already made sure that the database.yml contents are consistently indented, and I also checked my database.yml content here at https://www.yamllint.com/, and it shows its content is valid. But I still get the same error message.
错误消息表明问题出现在第 14 行第 13 列。并不总是清楚这些工具是否开始计算 0 或 1 的行和列,但我猜错误消息指的是
development
部分中的这一行:
password: <%= ENV['POSTGRES_PASSWORD'] %>
^
现在看看 Ruby on Rails 如何处理该文件是有意义的。首先它读取文件,然后处理该文件中的 ERB 语句并用它们的返回值替换这些语句,最后一步 Rails 解析 YAML。
这意味着,当 YAML 解析引发错误时,我们不需要查看原始 YAML 文件。但相反,我们需要了解处理 ERB 报表后文档会是什么样子。
而且由于错误消息所指的正是文档中
<%= ENV['POSTGRES_PASSWORD'] %>
的返回值开始的位置,因此很明显问题实际上是ENV['POSTGRES_PASSWORD']
的值。
我只能猜测。
ENV['POSTGRES_PASSWORD']
可能是空白,处理后该行可能看起来像这样:
password:
或者它可能存在,但密码以导致 YAML 无效的字符开头。假设密码是
{foo
,那么该行将如下所示:
password: {foo
因此,YAML 将无效,因为
{
是一个 指示符,在该位置是不允许的。
要解决此问题:
仔细检查
POSTGRES_PASSWORD
环境变量是否确实在您的开发环境中设置。
检查密码是否包含需要在 YAML 中进行特殊处理的字符。或者用引号将 ERB 语句的输出括起来,如下所示:
password: "<%= ENV['POSTGRES_PASSWORD'] %>"