2014-10-24 8 views
18

I powiązany moim app pojemnik do PostgreSQL na run:Jak łączyć kontenery dokowane w kompilacji?

docker run --link postgres:postgres someproject/develop 

i to działało dobrze.

Ale zdałem sobie sprawę, że muszę zainstalować pewne rzeczy do bazy danych za pomocą polecenia django przed run. Potrzebuję więc połączenia podczas build.

Jak mogę to zrobić?

docker build -h nie ma opcji --link.

+0

Co dokładnie musisz zrobić? Chcesz uruchomić skrypt w swojej bazie danych? – Behe

+0

@behe rodzaju. Muszę uruchomić dwa polecenia zarządzania django, które przygotują bazę danych dla aplikacji. Ale w prostym terminie - tak, muszę uruchomić skrypt dla mojej bazy danych. – syabro

+0

Możliwe jest uruchomienie bazy danych i wypełnienie jej podczas budowania obrazu. Nie można łączyć kontenerów przy kompilacji. (Może to być: http://mywiki.wooledge.org/XyProblem) – Behe

Odpowiedz

15

Dostałem odpowiedź od doker kontrybutora 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 

to będzie odpalić postgres. Odpal kontener, który przeprowadza migrację bazy danych i natychmiast wychodzi i usuwa się. Uruchamia aplikację szyn.

Pomyśl o procesie kompilacji, takim jak kompilowanie aplikacji. Nie wysiewasz danych do bazy danych w ramach fazy kompilacji.

4

Nie możesz tego zrobić. Można zbudować podrzędny obraz postgreatora lub zaktualizować bazę danych za każdym razem, gdy uruchamiasz kontener.

+0

Smutny, smutny, smutny :( – syabro

+0

@syabro Czy sprawdziłeś komendę ONBUILD? Sprawdź ten http://docs.docker.com/reference/builder/#onbuild – Robert

+0

@Rob Nie pomaga – syabro

2

Miałem podobny problem. Chciałem przyspieszyć kompilacje obrazów przy pomocy apt-cacher. Działa w swoim własnym pojemniku, a inne obrazy, które zbudowałem, musiały się z nim komunikować.

Rozwiązaniem było opublikowanie portu apt-cacher na wszystkich interfejsach. Obejmuje to np. docker0, która jest dostępna dla pośrednich kontenerów tworzonych podczas budowania obrazu.

Dockerfile Przykład:

FROM debian:8 

RUN ping -c 2 172.17.0.1 

I tak to się buduje:

$ 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

czy próbowałeś użyć compose? Jak odkryłeś, że ip: 172.17.0.1? – senz

+0

172.17.0.1 jest domyślnym adresem przydzielonym dla interfejsu 'docker0' (możesz go skonfigurować, przekazując' --bip' do 'daemona daemona'. Domyślnie skomponuj podejmie próbę połączenia wszystkich kontenerów usługowych z siecią prywatną, po czym następuje most i ma on inny adres. –

3

prawda, ale docker build odrzuca opcję --network.

można umieścić pojemniki wstępnych w sieci o nazwie/niestandardowego, np .:

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

Następnie zbudować na tej sieci:

docker build --network whatever [etc.] 

działa dobrze.

Powiązane problemy