无法运行rake db:在Docker-compose中的Dockerfile中创build

我有一个像本教程中的DockerfileDockerfile 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