我真的需要一些帮助。我是Ruby on Rails的新手。我正在使用postresql和docker构建一个rails 7.1.0应用程序。我正在Pop!_OS 22.04 LTS计算机上工作,安装了ruby 3.2.2(2023-03-30 revision e51014 f9 c 0)[x86_64-Linux]和psql(PostgreSQL)16.0(Ubuntu 16.0-1.pgdg22.04 +1)。在我运行命令“docker-compose build”后,编译过程一切顺利。
但是当我尝试运行docker-compose up
时,它一直说bin/rails aborted
!解析/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
字符串
以下是我的数据库.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'] %>
型
我的.env文件的内容
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
型
注意:我已经确保了database.yml的内容是一致缩进的,我也在https://www.yamllint.com/检查了我的database.yml内容,它显示它的内容是有效的。但我仍然得到相同的错误消息。
2条答案
按热度按时间aurhwmvo1#
错误消息告诉问题在 line 14 column 13.它并不总是清楚,如果这些工具开始计数行和列0或1,但我猜错误消息是指这一行在
development
部分:字符串
现在我们来看看Ruby on Rails是如何处理这个文件的,首先它读取这个文件,然后处理这个文件中的ERB语句,并将这些语句替换为它们的返回值,最后一步Rails解析YAML。
这意味着,当YAML解析引发错误时,我们不需要查看原始YAML文件。相反,我们需要了解ERB语句处理后文档的外观。
而且因为错误消息指的是文档中
<%= ENV['POSTGRES_PASSWORD'] %>
的返回值开始的位置,所以很明显问题实际上是ENV['POSTGRES_PASSWORD']
的值。我只能猜测.
ENV['POSTGRES_PASSWORD']
可能是空白的,处理后该行可能看起来像这样:型
或者它可能存在,但密码以一个导致YAML无效的字符开头。假设密码是
{foo
,那么该行看起来像这样:型
因此,YAML将无效,因为
{
是该位置不允许的指示符。要解决此问题,请执行以下操作:
POSTGRES_PASSWORD
环境变量是否在开发环境中实际设置。型
92dk7w1h2#
你不需要它。
在Rails中,您可以通过
ENV["DATABASE_URL"]
设置任何数据库设置,它会自动与database.yml
中的设置合并。例如,要以
bob
的身份使用密码p4ssword
连接到my_hostname
,您可以将ENV["DATABASE_URL"]
设置为:字符串
不需要创建一堆额外的配置变量。
事实上,你只需要在你的
database.yml
文件中最少的东西:型
在大多数情况下,Postgres在测试和开发中“只是工作”,因为默认值不需要任何配置。所有你需要做的就是在生产中设置一个单一的ENV var。
别把事情弄得太复杂了。
如果你的项目使用Docker,你也不需要DotEnv。如果需要任何额外的配置,请通过Docker配置或Rails加密凭证提供。