2015-10-24 3 views
1

Я создаю услугу, в которой контейнеры django порождаются по требованию для пользователей для проверки функциональности бэкэнд-онлайн.Динамически обслуживающие контейнеры django docker

Я хотел бы сделать порождали экземпляры доступными для пользователей на основной домен:

Пример: Пользователь нерестится контейнер userapp который предоставляет порт 8000, он должен быть доступен на моем домене, как mydomain.net/userapp/

Я не знать количество запущенных экземпляров или их имена заранее.

found a nginx-proxy I контейнер здесь, который динамически создает конфиги для nginx обслуживать контейнеры подобласти:

$ Docker запустить -e VIRTUAL_HOST = userapp.mydomain.com ...

Я хотел бы чтобы он был доступен на пути. Как создать динамические прокси-пути с помощью nginx или django?

ответ

1

Я понял это с помощью django-http-proxy.

Я могу наследовать от HttpProxy и создать DynProxyView:

views.py

from httpproxy.views import HttpProxy 

class DynProxyView(HttpProxy): 
    def get_object(self): 
     return Fiddle.objects.get(pk=self.kwargs['pk']) 
    rewrite = True 
    @property 
    def base_url(self): 
     url= self.request.scheme+"://localhost:" + str(self.get_object().port) 
     print url 
     return url 
    def get_full_url(self, url): 
     result = super(DynProxyView, self).get_full_url(url) 
     return result[:-1] # To get rid of a pesky redundant slash 

urls.py

... 
url(r'^(?P<pk>[-\w]+)/result/(?P<url>.*)$', DynProxyView.as_view(),name='result'), 
... 

models.py

class Fiddle(models.Model): 
    name = models.CharField(max_length=20, unique=True) 
    hash = models.CharField(max_length=32, null=True, blank=True) 
    port = models.IntegerField(null=True, blank=True) 

Таким образом, я получаю желаемый эффект.

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