2014-10-24 14 views
18

verknüpft ich meine App Container Postgres auf run:Wie Verknüpfen Docker-Container auf Build?

docker run --link postgres:postgres someproject/develop 

und es funktionierte gut.

Aber ich erkannte, dass ich einige Sachen in Datenbank mit Django-Befehl vor run installieren muss. Also muss ich verknüpfen während build.

Wie kann ich das tun?

docker build -h hat keine --link Option.

+0

Was genau müssen Sie tun? Sie möchten ein Skript in Ihrer Datenbank ausführen? – Behe

+0

@behe Art von. Ich muss zwei django-Verwaltungsbefehle ausführen, die die Datenbank für die Anwendung vorbereiten. Aber in einfachen Worten - ja, ich muss ein Skript für meine Datenbank ausführen. – syabro

+0

Es ist möglich, Ihre Datenbank zu starten und sie beim Erstellen Ihres Bildes zu füllen. Es ist nicht möglich, Container auf Build zu verknüpfen. (Könnte dies ein sein: http://mywiki.wooledge.org/XyProblem) – Behe

Antwort

15

bekam ich die Antwort vom Docker Beitrag Brian Goff:

docker run -d --name mydb postgres 
docker run --rm --link mydb:db myrailsapp rake db:migrate 
docker run -d --name myapp --link mydb:db myrailsapp 

Diese Postgres feuern wird. Starten Sie einen Container, der die Datenbankmigration ausführt und sofort beendet und sich selbst entfernt. Feuert die Schienen app.

Denken Sie an den Build-Prozess wie das Kompilieren einer Anwendung. Sie fügen Daten nicht als Teil der Kompilierungsphase in eine Datenbank ein.

4

Sie können dies nicht tun. Sie können entweder ein Child-Image von Postgres erstellen oder die Datenbank jedes Mal aktualisieren, wenn Sie den Container starten.

+0

Traurig, traurig, traurig :( – syabro

+0

@syabro Haben Sie den Befehl ONBUILD überprüft? Überprüfen Sie dies http://docs.docker.com/reference/builder/#onbuild – Robert

+0

@Rob Es hilft nicht – syabro

2

Ich hatte ein ähnliches Problem. Ich wollte Image-Builds mit Hilfe von beschleunigen. Es läuft in einem eigenen Container und irgendwie mussten andere Bilder, die ich gebaut habe, damit kommunizieren.

Die Lösung war apt-cacher Port auf allen Schnittstellen zu veröffentlichen. Dies beinhaltet z.B. docker0, die für Zwischencontainer verfügbar ist, die während des Image-Builds erstellt wurden.

Beispiel Dockerfile:

FROM debian:8 

RUN ping -c 2 172.17.0.1 

Und das ist, wie es baut:

$ docker build - <dock 
Sending build context to Docker daemon 2.048 kB 
Step 1 : FROM debian:8 
---> 47af6ca8a14a 
Step 2 : RUN ping -c 2 172.17.0.1 
---> Running in 4f56ce7c7b63 
PING 172.17.0.1 (172.17.0.1): 56 data bytes 
64 bytes from 172.17.0.1: icmp_seq=0 ttl=64 time=0.117 ms 
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.130 ms 
--- 172.17.0.1 ping statistics --- 
2 packets transmitted, 2 packets received, 0% packet loss 
round-trip min/avg/max/stddev = 0.117/0.123/0.130/0.000 ms 
---> 5c73a36a0a6a 
Removing intermediate container 4f56ce7c7b63 
+0

haben Sie versucht zu verwenden komponieren? Wie haben Sie festgestellt, dass ip: 172.17.0.1? – senz

+0

172.17.0.1 ist die Standardadresse für 'docker0' Schnittstelle zugewiesen (Sie können konfigurieren, indem Sie' --bip 'zu' Docker Daemon' übergeben. Standardmäßig komponieren wird versuchen, alle Dienstcontainer mit einem privaten Netzwerk zu verbinden Es gibt wieder eine Bridge und sie hat eine andere Adresse. –

3

Das stimmt, aber docker build akzeptiert die --network Option.

Sie können Ihre Voraussetzung Container auf einem Namen/custom Netzwerk, z.B .:

docker network create whatever 
docker run --network whatever --name postgres [etc.] someproject/develop 

Dann in diesem Netzwerk aufzubauen setzen:

docker build --network whatever [etc.] 

funktioniert gut.

Verwandte Themen