Compartilhando a base de código entre contêineres docker

6

Eu tenho dois contêineres. Um é usado para manter meu aplicativo django com gunicorn running e outro para a fila de tarefas de aipo.

O aipo usa a mesma base de código do aplicativo django.

Quando eu construo o contêiner do Docker do Django, uso a instrução ADD . /usr/src/app para copiar os arquivos de origem no contêiner. Mas o Dockerfile for Celery coloca em outra pasta, então não há possibilidade de copiar arquivos, pois eles estão fora de contexto.

Até agora, vejo duas possibilidades:

  • mount -o bind parece parecer hacky
  • manter duas cópias de arquivos pode causar uma situação fora de sincronia
  • declare a pasta do código-fonte como um volume e inicie o contêiner de aipo com volumes-from .

Atualmente, uso a terceira solução. Existem melhores maneiras? Use git clone no dockerfile? Mas como autenticar então ...

    
por Glueon 18.07.2015 / 11:31

2 respostas

4

Em nosso aplicativo docker atual, temos três imagens diferentes usadas para dois contêineres.

  • Base - Isso é o que mantém quaisquer dependências comuns (cabeçalhos de desenvolvimento), bem como o código-fonte do Python.
  • Web - instala as dependências específicas da web, como o Gunicorn. Também configura o CMD e as portas.
  • Worker - Isso instala as dependências específicas do trabalhador, principalmente configurando o usuário do Celery e bloqueando-o.

A imagem de base está na raiz do nosso repositório, e nossa imagem de base faz o equivalente a ADD . /usr/src/app junto com algumas outras coisas. Ambas as imagens da Web e do trabalhador se estendem a partir dessa imagem de base, portanto, elas também têm o código-fonte.

Isso permite que você compartilhe o código entre os dois contêineres e não exige que você tenha outro volume que contenha o código.

Um exemplo de configuração para os três Dockerfiles seria

./ Dockerfile

FROM python:3.4

ADD . /usr/src/app

RUN pip install -r /usr/src/app/requirements.txt

./ web / Dockerfile

FROM app-base:latest

RUN pip install gunicorn

./ worker / Dockerfile

FROM app-base:latest

RUN pip install celery

O qual precisaria ser criado como

docker build -t app-base .
docker build -t app-web web
docker build -t app-worker worker

Isso não funcionará com docker compondo porque ele não suporta herança de imagens .

    
por 18.07.2015 / 20:07
1

Minha resposta original ainda serve como uma solução válida para o problema, mas agora existe outra solução a partir do Docker 1.6.0. Agora você pode especificar a localização do Dockerfile e não precisa estar no mesmo diretório que a raiz do contexto de construção.

./ Dockerfile.web

FROM python:3.4

ADD . /usr/src/app

RUN pip install gunicorn

./ Dockerfile.worker

FROM python:3.4

ADD . /usr/src/app

RUN pip install celery

Recomenda-se manter as linhas ADD no topo de seu Dockerfile , portanto, a adição só precisa acontecer uma vez e pode ser reutilizada para criar imagens da Web e de trabalho.

Você pode criar as imagens como

docker build -t app-web -f Dockerfile.web .
docker build -t app-worker -f Dockerfile.worker .

Ou usando o Docker Compose , a configuração seria semelhante a

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.web
  worker:
    build:
      context: .
      dockerfile: Dockerfile.worker
    
por 02.07.2016 / 20:22

Tags