2015-07-21 17 views
14

Ho un Dockerfile e docker-compose.yml come nel tutorial tranne che sto iniziando con un'app esistente.Impossibile eseguire rake db: creare in Dockerfile con docker-comporre

mio docker-compose.yml assomiglia:

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 

e 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 

e database.yml

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

Come potete vedere, ho commentato RUN bundle exec rake db:create perché stavo ricevendo un errore:

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} 

Invece ho dovuto docker-compose buildpoidocker-compose run web rake db:create ecc

Perché non posso avere il db-creazione/migrazione nella Dockerfile. Sarebbe molto più chiaro. Posso riuscirci?

risposta

17

Quando l'immagine web è costruita (seguendo le istruzioni dello Dockerfile), non ha una connessione a un contenitore db.

il server web e database immagini sono indipendenti e i contenitori sono collegati quando si avvia li (secondo le definizioni del file docker-compose.yml).

Non è possibile creare un collegamento a un contenitore durante la creazione dell'immagine perché sarebbe infrangere il principio che una generazione di immagini deve essere riproducibile. Allo stesso modo, non è possibile montare un volume dal computer host durante una generazione di immagini.

Il comando docker-compose run web rake db:create utilizzato è un modo corretto di inizializzare il database.

alternativa, è possibile lanciare i contenitori normalmente con docker-compose, e quindi utilizzare il comando da eseguire docker execrake db:create nel contenitore web.

+0

quindi qual è la soluzione? creare uno script di shell che esegua rake db: setup'? e avviare i contenitori? –

+0

Penso che non sia necessario scrivere uno script per eseguire entrambe le operazioni perché 'rake db: setup' dovrebbe essere eseguito solo una volta.Non è necessario eseguirlo ogni volta che si avviano i contenitori. –

+0

Quindi perché nei documenti ufficiali si dice che dobbiamo eseguire il comando 'docker-compose run web rake db: create' al riavvio dei contenitori? https://docs.docker.com/compose/rails/#restart-the-application – leymannx

0

È possibile montare /tmp/db nel contenitoredel contenitore Postgres.

In questo modo il DB verrà sincronizzato con l'host e al successivo riavvio/ricostruzione dell'app questo DB verrà automaticamente inizializzato. Azioni in modo da avere per eseguire docker-compose run web rake db:createsolo una volta quando si imposta il progetto come si farebbe per nativo e da allora in poi proseguire con solo docker-compose run web rake db:create ecc

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 

Mi chiedo perché non ha scritto che nei documenti hai collegato. Ho aperto un PR per aggiungere questo.

Problemi correlati