2014-10-24 8 views
18

Я связала мое приложение контейнер для Postgres на run:Как связать контейнеры докеров в сборке?

docker run --link postgres:postgres someproject/develop 

и он работал отлично.

Но я понял, что мне нужно установить некоторые вещи в базу данных с помощью команды django до run. Поэтому мне нужна ссылка, а build.

Как я могу это сделать?

docker build -h не имеет --link опция.

+0

Что вам нужно сделать именно так? Вы хотите запустить скрипт в своей базе данных? – Behe

+0

@behe. Мне нужно запустить две команды управления django, которые подготовят базу данных для приложения. Но в простой перспективе - да, мне нужно запустить какой-то скрипт для моей базы данных. – syabro

+0

Возможно создание базы данных и ее заполнение при создании изображения. Невозможно связать контейнеры при сборке. (Возможно, это будет: http://mywiki.wooledge.org/XyProblem) – Behe

ответ

15

Я получил ответ от докер вкладчика Брайан Гофф:

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 

Это собирается запустить Postgres. Запустите контейнер, который выполняет миграцию db и немедленно выйдет и удалит себя. Восстанавливает рельсы приложение.

Подумайте о процессе сборки, таком как компиляция приложения. Вы не загружаете данные в базу данных как часть фазы компиляции.

4

Вы не можете этого сделать. Вы можете либо создать дочерний образ postgres, либо обновить базу данных при каждом запуске контейнера.

+0

Ужасно, грустно, грустно :( – syabro

+0

@syabro Вы проверили команду ONBUILD? Проверьте это http://docs.docker.com/reference/builder/#onbuild – Robert

+0

@Rob Это не помогает – syabro

2

У меня была аналогичная проблема. Я хотел ускорить создание изображений с помощью apt-cacher. Он работает в собственном контейнере, и каким-то другим изображениям, которые я построил, пришлось общаться с ним.

Решение о публикации apt-cacher порт на всех интерфейсах. Это включает, например, docker0, который доступен для промежуточных контейнеров, созданных при сборке изображений.

Dockerfile Пример:

FROM debian:8 

RUN ping -c 2 172.17.0.1 

И это, как он строит:

$ 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

вы пытались использовать составляете? Как вы обнаружили, что ip: 172.17.0.1? – senz

+0

172.17.0.1 - это адрес по умолчанию, выделенный для интерфейса 'docker0' (вы можете настроить его, передав' --bip' 'docker daemon'. По умолчанию будет пытаться подключить все служебные контейнеры к частной сети. Снова мост и имеет другой адрес. –

3

Правда, но docker build действительно принимает параметр --network.

Вы можете поместить свои предварительные контейнеры на имени/пользовательской сети, например .:

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

Затем построить в этой сети:

docker build --network whatever [etc.] 

работает хорошо.

Смежные вопросы