`initialize': the scheme postgres does not accept registry part: postgres:@ (or bad hostname?) (URI::InvalidURIError) with Docker

后端 未结 3 1050
Happy的楠姐
Happy的楠姐 2021-02-13 12:38

I\'m using Rails with Postgres DB Docker container attached. It looks like I\'m getting below error when I run rails c:

/usr/local/rvm/rubies/ruby-2         


        
相关标签:
3条回答
  • 2021-02-13 13:16

    Rename your environment variable!

    DATABASE_URL is reserved by Rails, and interpreted by ActiveRecord itself. I ran into the same issue.

    Instead, use something like this:

        host:     <%= ENV['DB_HOST'] %>
        password: <%= ENV['DB_PWD'] %>
    
    0 讨论(0)
  • 2021-02-13 13:24

    From the "Configuring Rails Applications" guide, it would appear that DATABASE_URL is used for configuring database access. Another way to configure database access is the presence of the file config/database.yml. Trying to use both methods to configure database access causes the issue you are facing.

    if your password contains unsafe characters

    Connection string used for DATABASE_URL cannot contain special characters (anything other than [a-zA-Z0-9_~-\.], e.g. @ is a common one to mess up). Solution is to url-encode.

    if you are using dokku

    • https://github.com/Kloadut/dokku-pg-plugin/issues/76 - Host and Port information are missing
    • https://github.com/dokku/dokku-postgres/issues/28 - Rewritten link command generates invalid host

    if you are using pghero

    • https://github.com/ankane/pghero - Fail to start if password contain @
    0 讨论(0)
  • 2021-02-13 13:30

    The accepted answer is wrong. There's nothing wrong with using DATABASE_URL in your database.yml, although doing so explicitly is probably redundant. The problem is with the value of the URL.

    ActiveRecord uses URI::RFC2396_Parser to parse database URLs. The error message above indicates that it's not able to parse the URL, probably because the hostname is missing, cf.

    URI::RFC2396_Parser.new.parse('postgres://postgres:@/mydb')
    # Traceback (most recent call last):
    #       1: from (irb):30
    # URI::InvalidURIError (the scheme postgres does not accept registry part: postgres:@ (or bad hostname?))
    

    Other invalid hostnames, such as hostnames with underscores (common in docker-compose setups) will cause similar errors:

    URI::RFC2396_Parser.new.parse('postgres://postgres:postgres@my_postgres/mydb')
    # Traceback (most recent call last):
    #        1: from (irb):34
    # URI::InvalidURIError (the scheme postgres does not accept registry part: postgres:postgres@my_postgres (or bad hostname?))
    

    What can be especially confusing is that URI.parse() uses URI::RFC3986_Parser, which is much more forgiving, and will accept either of these "bad" URLs.

    0 讨论(0)
提交回复
热议问题