如何在Docker中运行Rails?PG :: ConnectionBad无法将主机名“ pg”转换为地址:没有与主机名关联的地址

Chl*_*loe 5 ruby-on-rails docker docker-compose

我试图在这里遵循指南:https : //docs.docker.com/compose/rails/

docker-compose.yml
version: '3'
services:
  pg:                                     ######### LOOK HERE!
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails server -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - pg
    links:
      - pg                                     ######### LOOK HERE!
  cms:
    image: joomla
    restart: always
    links:
      - mysql:joomladb
    ports:
      - 8080:80
    environment:
      JOOMLA_DB_HOST: mysql
      JOOMLA_DB_PASSWORD: example
  mysql:
    image: mysql:5.6
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
Run Code Online (Sandbox Code Playgroud) config/database.yml
# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  timeout: 5000
  host: pg                                     ######### LOOK HERE!
  username: postgres
  password:

development:
  <<: *default
  database: project

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: project_test

production:
  <<: *default
  database: project
Run Code Online (Sandbox Code Playgroud)

安慰

C:\Users\Chloe\workspace\project\src>docker-compose run web rake db:create
Starting src_pg_1 ... done
could not translate host name "pg" to address: No address associated with hostname
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "pool"=>5, "timeout"=>5000, "host"=>"pg", "username"=>"postgres", "password"=>nil, "database"=>"project"}
rake aborted!
PG::ConnectionBad: could not translate host name "pg" to address: No address associated with hostname
Run Code Online (Sandbox Code Playgroud)

docker-compose版本1.20.1,内部版本5d8c71b2,Docker版本18.03.0-ce,内部版本0520e24302

swi*_*osz 5

好的,我会尝试回答这个问题:

通常,当出现此错误时,可能意味着运行db容器返回了一些错误并停止了。

我遇到了同样的问题,经过一番挖掘发现我有

LANG='en_US.UTF-8'
LANGUAGE='en_US:en'
LC_ALL='en_US.UTF-8'
Run Code Online (Sandbox Code Playgroud)

在我的环境变量中设置,这导致db容器停止。因此,由于容器没有运行,我没有db主机。

我的docker-compose.yml文件如下所示:

version: '3'

services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    env_file: .env
  app:
    build: .
    command: bundle exec puma -p 3000 -C config/puma.rb
    env_file: .env
    volumes:
      - .:/app
    ports:
      - "3031:3000"
    depends_on:
      - db
Run Code Online (Sandbox Code Playgroud)

这是config/database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  pool: 5
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>

development:
  <<: *default
  database: driggl_dev

test:
  <<: *default
  database: driggl_test

production:
  <<: *default
  database: driggl_prod
Run Code Online (Sandbox Code Playgroud)

...以及.env用于开发的文件:

POSTGRES_USER=driggl
POSTGRES_PASSWORD=driggl
Run Code Online (Sandbox Code Playgroud)

由于我有数据库数据的共享卷,因此tmp/db为了确定起见,我从存储库中删除了该文件夹。

rm -rf tmp/*
Run Code Online (Sandbox Code Playgroud)

然后我删除了所有容器和图像

docker rm $(docker ps -q -a) -f
docker rmi $(docker images -q) -f
Run Code Online (Sandbox Code Playgroud)

最后我再次启动容器:

docker-compose up --build
Run Code Online (Sandbox Code Playgroud)

一切终于顺利了。

概括

  1. 确保系统中某处没有缓存任何内容
  2. 确保您的数据库容器在启动时不会返回错误。

我希望这会对遇到该问题的任何人有所帮助。


bku*_*i01 4

这个设置适用于我在 docker 上运行 Rails。基本上需要指定一个 URL,因此您将使用 .env 文件来指定 postgres url,并且您将使用配置/数据库文件在 _development _test 和 _Production 之间进行更改,只需添加 env 即可。文件到您的 Web 服务 docker-compose 文件:

/docker-compose.yml:

services:
  postgres:
    image: postgres:9.6
    restart: always
    environment:
      POSTGRES_USER: kunzig #DockerHub postgres docs state this is optional but must be used when password is set.  It will also create a db under the supplied username which you'll use to connect to in rails console such as: $docker-compose exec postgres psql -U YourUserNameHere
      POSTGRES_PASSWORD: 'whateverPWYouWant'
    ports:
      - '5432' #Was originally 5432:5432 with the Left hand side being port on host machine, right hand side is the port on the docker container.  However I let docker choose the port it will use by supplying because 5432 is running on my local for other projects.  
    volumes:
      - postgres:/var/lib/postgresql/data 



  web:
    build: . #Runs the docker build command on the current directory
    links: #Links the listed services to our application so containers can talk to eachother
      - postgres
      - redis
    restart: always
    volumes:
      - .:/kunzig #Left hand side is current directory of compose file, right hand side is container folder.  This needs to be same as Install_path folder in Dockerfile.
    ports:
      - '8000:8000' #Left is the local port and the right side is the container port
    env_file:
      - .YourProjectNameHere.env #This should be in your root project directory along side the Dockerfile and docker-compose file
    depends_on:
      - 'redis'
      - 'postgres'
Run Code Online (Sandbox Code Playgroud)

/.项目名称.env

DATABASE_URL=postgresql://PostgresUserNameHere:PasswordFromDockerCompose@postgres:5432/PostgresUsername?encoding=utf8&pool=5&timeout=5000
Run Code Online (Sandbox Code Playgroud)

/config/database.yml

development:
  url: <%= ENV['DATABASE_URL'].gsub('?', '_development?' ) %>
test:
  url: <%= ENV['DATABASE_URL'].gsub('?', '_test?' ) %>
production:
  url: <%= ENV['DATABASE_URL'].gsub('?', '_production?' ) %>
Run Code Online (Sandbox Code Playgroud)

将您的 Web 服务与 pg 服务保持链接,因为您拥有它,您应该很好地继续,只需注意我将我的服务称为 postgres 即可。

  • 但是你仍然使用主机名`@postgres:5432`,所以如果现在找不到主机名,那么如何使用包含主机名的URL呢? (2认同)