2016-06-29 56 views
9

Ho appena seguito questo articolo su Running a Rails Development Environment in Docker. Il buon articolo, funziona alla grande. Dopo aver impostato tutto, ho deciso di andare avanti e impostare un ambiente di produzione.Docker Compose + Rails: best practice per migrare?

OBIETTIVO:

voglio rake db:create && rake db:migrate ogni volta che si esegue la mia immagine finestra mobile.

PROBLEMA:

Se mi muovo i passi di creazione e migrazioni database ...

docker-compose run app rake db:create 
docker-compose run app rake db:migrate 

... nel Dockerfile ...

RUN rake db:create && rake db:migrate 

... che genererà un errore ...

could not translate host name "postgres" to address: Name or service not known 

... perché il host nel mio database.yml ...

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 
    timeout: 5000 
    username: postgres 
    host: postgres 
    port: 5432 

development: 
    <<: *default 
    database: rails_five_development 

... è impostato sul nome postgres servizio specificato nel mio docker-compose.yml ...

version: "2" 
services: 
    postgres: 
    image: postgres:9.5 
    ports: 
     - "5432" 
    app: 
    build: . 
    command: rails server -p 3000 -b '0.0.0.0' 
    volumes: 
     - .:/app 
    ports: 
     - "3000:3000" 
    links: 
     - postgres 

... dal questa è la pratica raccomandata come indicato dall'articolo.

DOMANDA:

Come posso automaticamente rake db:create && rake db:migrate ogni volta che la mia immagine finestra mobile è gestito?

I am trying to achieve the same thing as in this question

risposta

13

Da https://docs.docker.com/engine/reference/builder/#/cmd:

Se volete il vostro contenitore per eseguire lo stesso eseguibile ogni volta, allora si dovrebbe considerare l'utilizzo di EntryPoint in combinazione con CMD. Vedere EntryPoint

https://docs.docker.com/engine/reference/builder/#/entrypoint

tl; dr

Si potrebbe definire un entrypoint sotto app e definire un file bash c'è:

app: 
    entrypoint: [bin/entry] 
    .. 

esempio file bin/entry:

#!/bin/bash 
set -e 

rake db:create 
rake db:migrate 

exec "[email protected]" 
5

Questo approccio crea il database se la migrazione non riesce. Evita anche il issue di non essere in grado di avviare il server perché un file pid è stato lasciato alle spalle. Creare il file come app/lib/docker-entrypoint.sh.

#!/bin/sh 
# https://stackoverflow.com/a/38732187/1935918 
set -e 

if [ -f /app/tmp/pids/server.pid ]; then 
    rm /app/tmp/pids/server.pid 
fi 

bundle exec rake db:migrate 2>/dev/null || bundle exec rake db:setup 

exec bundle exec "[email protected]" 

La finestra mobile-comporre.yml quindi comprende:

entrypoint: ["/app/lib/docker-entrypoint.sh"] 
command: ["rails","server","-b","0.0.0.0","-p","3000"] 
2

Io uso un Makefile:

run: 
    docker-compose up -d \ 
    && docker-compose run web rake db:create 

Così, ora quando voglio docker-compose up Io faccio solo make run invece.

+0

come fai a fuggire dal colon? Prendo il seguente 'make: *** Nessuna regola per rendere il target 'create', necessario per 'eseguire'. Fermati! –

+1

non dovresti aver bisogno di preoccuparti di sfuggire a qualsiasi punto se si formatta correttamente il Makefile. prova a mettere tutto su una riga 'docker-componi up -d && docker-componi eseguire web rake db: create' e assicurati di utilizzare le schede (^ I) e non gli spazi – davidpm4