2016-06-29 6 views
9

Ich folgte diesem Artikel auf Running a Rails Development Environment in Docker. Guter Artikel, funktioniert super. Nachdem ich alles eingerichtet hatte, beschloss ich, eine Produktionsumgebung einzurichten.Docker Compose + Rails: Best Practice für die Migration?

ZIEL:

Ich möchte rake db:create && rake db:migrate jedes Mal mein Docker Bild ausgeführt wird.

PROBLEM:

Wenn ich die Datenbankerstellung und Migrationen Schritten bewegen ...

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

... in die Dockerfile ...

RUN rake db:create && rake db:migrate 

... das wird einen Fehler werfen ...

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

... weil die host in meinem database.yml ...

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

development: 
    <<: *default 
    database: rails_five_development 

... ist mit dem postgres Service-Namen in meinem 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 

... angegeben gesetzt, da Das ist die empfohlene Vorgehensweise, auf die der Artikel hinweist.

FRAGE:

Wie kann ich rake db:create && rake db:migrate automatisch jedes Mal, wenn mein Docker Bild ausgeführt wird?

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

Antwort

13

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

Wenn Sie Ihren Container mögen das gleiche ausführbare Datei jedes Mal ausgeführt wird, dann sollten Sie mit CMD mit ENTRYPOINT in Kombination betrachten. Siehe ENTRYPOINT

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

tl; dr

Sie könnten eine entrypoint unter app definieren und eine Bash-Datei definieren es:

app: 
    entrypoint: [bin/entry] 
    .. 

bin/Eintrag Datei Beispiel:

#!/bin/bash 
set -e 

rake db:create 
rake db:migrate 

exec "[email protected]" 
5

Dieser Ansatz erstellt die Datenbank, wenn die Migration nicht erfolgreich ausgeführt werden kann. Es vermeidet auch die issue, den Server nicht zu starten, da eine PID-Datei zurückgelassen wurde. Erstellen Sie die Datei als 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]" 

Die Docker-komponieren.yml beinhaltet dann:

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

ich ein Makefile verwenden:

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

So, jetzt, wenn ich will docker-compose up ich nur make run statt.

+0

Wie entkommen Sie dem Doppelpunkt? Ich erhalte die folgende 'make: *** Keine Regel, um das Ziel 'create' zu machen, benötigt von 'run'. Stop.' –

+1

Sie sollten sich keine Gedanken darüber machen müssen, irgendwelche Doppelpunkte zu umgehen, wenn Sie das Makefile korrekt formatieren. versuche, alles auf eine Zeile zu setzen 'docker-compose up -d && docker-compose renne den Web-Rake db: create' und stelle sicher, dass Tabs (^ I) und keine Leerzeichen verwendet werden – davidpm4