无法运行rake db:在Docker-compose中的Dockerfile中创build
我有一个像本教程中的Dockerfile
和Dockerfile
docker-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中创build/迁移数据库? 这将是非常清楚的。 我能做到吗?
当你的web
图像被构build时(按照Dockerfile
的说明),它没有到db
容器的连接。
Web服务器和数据库映像是独立的 , 当启动它们时,容器是链接的 (遵循docker-compose.yml
文件的定义)。
在图像构build期间,您无法链接到容器,因为这会违反图像构build必须可重现的原则 。 同样,在映像构build过程中,您也无法从主机装入卷。
docker-compose run web rake db:create
命令是用来初始化数据库的正确方法。
或者,你可以用docker docker-compose
正常启动容器,然后使用docker docker exec
命令在web
容器中执行rake db:create
。