Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Multi-stage build

Como fazer uma multi-stage build pro django? Acontece que quando só copio os documentos usuais, a multi-stage não funciona - ou seja, possivelmente tenho que copiar outros arquivos.

Alguém poderia me ajudar?

Docker Single image (funcionando):

FROM python:latest AS build

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

ARG APPLICATION_NAME=application
ARG DATE=$(date +%Y-%m-d%-%H%M)

LABEL maintaner="andreichiro@gmail.com"
LABEL .br.com.andreichiro-schema.date=$DATE
LABEL .br.com.andreichiro-schema.application=$APPLICATION_NAME

WORKDIR /app 
RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client && rm -rf /var/lib/apt/lists/*
RUN apt update && apt install git -y
COPY requirements.txt .
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt --no-cache-dir
COPY . .

EXPOSE 8000

ENTRYPOINT python manage.py runserver 0.0.0.0:8000

Docker Multi-stage (dando erro):


FROM python:latest AS build

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

ARG APPLICATION_NAME=application
ARG DATE=$(date +%Y-%m-d%-%H%M)

LABEL maintaner="andreichiro@gmail.com"
LABEL .br.com.andreichiro-schema.date=$DATE
LABEL .br.com.andreichiro-schema.application=$APPLICATION_NAME

WORKDIR /app 
RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client && rm -rf /var/lib/apt/lists/*
RUN apt update && apt install git -y
COPY requirements.txt .
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt --no-cache-dir
COPY . .

FROM python:latest AS run

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

ARG DATE=$(date +%Y-%m-d%-%H%M)
ARG APPLICATION_NAME=application

LABEL maintaner="andreichiro@gmail.com"
LABEL .br.com.andreichiro-schema.date=$DATE
LABEL .br.com.andreichiro-schema.application=$APPLICATION_NAME

WORKDIR /app 
COPY --from=build /app/* .

EXPOSE 8000

ENTRYPOINT python manage.py runserver 0.0.0.0:8000
5 respostas

Olá André

Na sua abordagem de multi-stage Docker, você precisa definir explicitamente quais arquivos deseja copiar do estágio anterior para o estágio atual. No seu exemplo, você está copiando todos os arquivos do diretório de compilação usando COPY --from=build /app/* ., mas isso pode não incluir todos os arquivos necessários para o seu aplicativo funcionar corretamente.

Uma abordagem mais segura seria copiar apenas os arquivos necessários, como o arquivo manage.py e o diretório myapp (substitua myapp pelo nome do diretório do seu aplicativo Django). Para fazer isso, você pode alterar a última linha do seu Dockerfile para:

COPY --from=build /app/manage.py /app/myapp /app/ Isso deve garantir que todos os arquivos necessários sejam copiados do estágio de compilação para o estágio de execução.

Além disso, verifique se você tem todos os pacotes necessários instalados no estágio de compilação. Isso pode incluir pacotes do sistema operacional (como bibliotecas para dependências de Python) e bibliotecas Python adicionais necessárias para o seu aplicativo. Certifique-se de instalar esses pacotes no estágio de compilação e incluí-los no arquivo requirements.txt para que sejam instalados no estágio de execução.

Muito obrigado! No caso, gerei o requirements com o pip freeze >. Existe algum jeito mais 'garantido'?

Olá, André! O comando "pip freeze" é uma forma comum de gerar o arquivo requirements.txt para uma aplicação Python, pois lista todas as dependências do ambiente virtual em que a aplicação está sendo desenvolvida. No entanto, é importante lembrar que algumas dessas dependências podem não ser necessárias ou até mesmo causar conflitos no ambiente de produção.

Uma abordagem mais "garantida" seria criar um ambiente virtual limpo e instalar apenas as dependências necessárias para a aplicação funcionar corretamente. Dessa forma, você terá um ambiente mais limpo e menos suscetível a conflitos.

Para criar um ambiente virtual, você pode usar a ferramenta "virtualenv" ou o "venv" (que vem integrado com o Python a partir da versão 3.3). Depois de criar o ambiente virtual, você pode instalar as dependências necessárias usando o comando "pip install", passando o nome do pacote ou um arquivo requirements.txt como argumento.

Por exemplo:

# Crie um ambiente virtual
python3 -m venv myenv

# Ative o ambiente virtual
source myenv/bin/activate

# Instale as dependências
pip install -r requirements.txt

Dessa forma, você garante que está instalando apenas as dependências necessárias para a aplicação funcionar corretamente, sem instalar pacotes desnecessários ou potencialmente conflitantes.

Legal! Muito obrigado. Seria indicado o uso de ambiene virtual mesmo que eu esteja fazendo uma imagem docker? Nesse caso, a venv isolaria as dependências python/django e o docker faria seus isolamentos (PID, MNT etc).. não existe nenhum conflito?

solução!

é comum usar ambientes virtuais mesmo quando se está construindo imagens Docker. O ambiente virtual ajuda a isolar as dependências do projeto, garantindo que apenas as versões necessárias estejam instaladas e evitando conflitos entre diferentes projetos ou entre o projeto e o sistema operacional.

Docker isola o ambiente de execução da aplicação, fornecendo um ambiente padronizado e consistente para o projeto, independentemente do sistema operacional e do hardware subjacente. Isso torna a aplicação portátil e facilita a implantação em diferentes ambientes.

Dessa forma, não há conflito entre o uso de ambientes virtuais e o uso de contêineres Docker. Na verdade, usar ambientes virtuais é uma prática recomendada em conjunto com contêineres Docker.