无法使用docker-compose在Dockerfile中运行rake db:create

时间:2015-07-21 10:02:30

标签: ruby-on-rails docker docker-compose

我在tutorial中有Dockerfiledocker-compose.yml,但我从现有应用开始。

我的docker-compose.yml看起来像是:

db:
  image: postgres
  ports:
    - "5432"
web:
  build: .
  command: bundle exec rails s -p 3000 -b '0.0.0.0'
  volumes:
    - .:/myapp
  ports:
    - "3030:3030"
  links:
    - db

Dockerfile

FROM ruby:2.1.4
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp
# RUN bundle exec rake db:create
# RUN bundle exec rake db:migrate
# RUN bundle exec rake db:seed

database.yml

development:
  adapter: postgresql
  encoding: utf8
  database: myapp_development
  host: db
  pool: 5
  username: postgres
  password:

如您所见,我评论RUN bundle exec rake db:create,因为我收到了错误:

could not translate host name "db" to address: Name or service not known
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:1222:in `initialize'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:1222:in `new'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:1222:in `connect'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:324:in `initialize'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `new'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `postgresql_connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:315:in `new_connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:325:in `checkout_new_connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:247:in `block (2 levels) in checkout'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `loop'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:242:in `block in checkout'
/usr/local/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:239:in `checkout'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:102:in `block in connection'
/usr/local/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:101:in `connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_pool.rb:410:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_specification.rb:171:in `retrieve_connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/connection_adapters/abstract/connection_specification.rb:145:in `connection'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/railties/databases.rake:144:in `rescue in create_database'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/railties/databases.rake:85:in `create_database'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/railties/databases.rake:62:in `block (3 levels) in <top (required)>'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/railties/databases.rake:62:in `each'
/usr/local/bundle/gems/activerecord-3.2.21/lib/active_record/railties/databases.rake:62:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:240:in `call'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:240:in `block in execute'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:235:in `each'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:235:in `execute'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain'
/usr/local/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:172:in `invoke_with_call_chain'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/task.rb:165:in `invoke'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:150:in `invoke_task'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:106:in `each'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:106:in `block in top_level'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:115:in `run_with_threads'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:100:in `top_level'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:78:in `block in run'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:176:in `standard_exception_handling'
/usr/local/bundle/gems/rake-10.4.2/lib/rake/application.rb:75:in `run'
/usr/local/bundle/gems/rake-10.4.2/bin/rake:33:in `<top (required)>'
/usr/local/bundle/bin/rake:16:in `load'
/usr/local/bundle/bin/rake:16:in `<main>'
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"utf8", "database"=>"myapp_development", "host"=>"db", "pool"=>5, "username"=>"postgres", "password"=>nil}

相反,我必须docker-compose build 然后 docker-compose run web rake db:create等。

为什么我无法在Dockerfile中进行db-creation / migration。它会非常清楚。我可以实现吗?

3 个答案:

答案 0 :(得分:18)

构建web图片后(按照Dockerfile的说明操作),它与db容器没有连接。

网络服务器和数据库图像是独立的容器在启动时链接(遵循docker-compose.yml文件的定义)。

在图像构建期间无法链接到容器,因为它会违反图像构建必须可重现的原则。同样,在图像构建期间也无法从主机安装卷。

您使用的docker-compose run web rake db:create命令是初始化数据库的正确方法。

或者,您可以使用docker-compose正常启动容器,然后使用docker exec命令在rake db:create容器中执行web

答案 1 :(得分:0)

以下是正确的顺序

❯ docker-compose run web rake db:create
Starting devops-hello-world_db_1 ... done
Creating devops-hello-world_web_run ... done
Created database 'myapp_development'
Created database 'myapp_test'

❯ docker-compose up
devops-hello-world_db_1 is up-to-date
Starting devops-hello-world_web_1 ... done
...

答案 2 :(得分:-1)

您可能希望将/tmp/db装入postgres容器中/var/lib/postgresql/data

由此,DB将同步到您的主机,下次重新启动/重建应用程序时,将自动初始化此DB。所以,当您设置项目时,必须只运行docker-compose run web rake db:create 一次,就像您原生那样,然后再继续docker-compose run web rake db:create等。

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data # Here you go!
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

我真的很想知道为什么他们没有将这些内容写入您链接的文档中。我开了一个PR来添加它。