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 .