2013-09-14 2 views
3

Допустим, у меня есть контейнер, который полностью оборудован для обслуживания приложения Rails с помощью Passenger и Apache, и у меня есть хост, который направляется в/var/www/app/public в моем контейнере. Поскольку контейнер должен быть похож на процесс, что бы я сделал, когда изменился код Rails? Если app был клонирован с Git, и есть ли ожидаемые изменения в репо, как может контейнер pull в этих изменениях автоматически?Docker rails app и git

ответ

0

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

С помощью изображения, с которого начинается ваш бегущий контейнер, вы можете добавить еще один шаг сборки, чтобы git вытащил ваш самый современный код. Я бы рассматривал это инкрементное обновление как ваше здание на уже существовавшем изображении. Я бы рекомендовал пометку и нажатие на ваш (при условии, что вы используете частный индекс) соответствующим образом. Новое изображение будет доступно для запуска.

В зависимости от необходимости вы также можете восстановить базовое изображение своего программного обеспечения. Я предполагаю, что вы используете Dockerfile для создания исходного изображения, которое включает git checkout вашего программного обеспечения. Затем вы можете пометить и нажать на свой индекс для использования соответствующим образом.

+0

Итак, мне нужно будет создать новый контейнер и нажимать изображение каждый раз, когда меня изменяет код rails? – Snowman

+0

@moby вы можете подключить каталог приложений к файловой системе хоста в свой контейнер и запустить оттуда. поэтому код будет обновлен, если ваши файлы будут затронуты. – alexzg

8

У вас есть выбор, как вы хотите, чтобы структурировать ваш контейнер, в зависимости от вашей философии развертывания:

  • Минимально: установить все ваши рельсы предварительно Reqs в Docker файл (команды RUN) , но у ENTRYPOINT есть что-то вроде «git pull && bundle install --deployment && rails run». При загрузке контейнера он получит ваш последний код.

  • Snapshot: То же, что и выше, но есть Entrypoint также быть командой RUN. Таким образом, в контейнере есть предварительно установленный снимок кода, но он будет обновляться при загрузке контейнера. Иногда это может ускорить время загрузки (т. Е. Если большая часть драгоценных камней уже установлена).

  • Контейнер по развертыванию: То же, как указано выше, но изменить Entrypoint быть «rails run» только. Таким образом, ваш контейнер будет вашего кода. Вам придется создавать новые контейнеры каждый раз, когда вы меняете рельсы (автоматизация!). Преимущество заключается в том, что вашему контейнеру не нужно будет вообще связываться с вашим репо кода. Недостатком является то, что вы должны всегда помнить, что такое последний контейнер. (Теги могут помочь) И прямо сейчас, Docker не имеет хорошей истории по очистке старых контейнеров.

0

В docker v0.8 В запущенном контейнере можно будет запустить новую команду, чтобы вы могли делать то, что хотите.

В то же время одно решение будет заключаться в использовании томов.

Вариант 1: Docker удалась объемы FROM ubuntu ... VOLUME ["/var/www/app/public"] ADD host/src/path /var/www/app/public CMD start rails

Start и запустить свой контейнер, а затем, когда вам нужно мерзавец тянуть, вы можете просто: $ docker ps # -> retrieve the id of the running container $ docker run -volumes-from <container id> <your image with git installed> sh -c 'cd/var/www/app/public && git pull -u'

Это приведет к вашему первому запущенному контейнеру, чтобы иметь источники обновлены.

Вариант 2: объемы Принимающие

Вы можете начать свой контейнер с: $ docker run -v `pwd`/srcs:/var/www/app/public <yourimage>

, а затем просто git pull в каталоге источников вашего хоста, он будет обновлять источники контейнера.