Em um Dockerfile, tenho uma camada que instala requirements.txt
:
FROM python:2.7
RUN pip install -r requirements.txt
Quando eu construo a imagem do docker, ela executa todo o processo, independentemente de quaisquer alterações feitas neste arquivo.
Como posso ter certeza de que o Docker só será executado pip install -r requirements.txt
se houver uma alteração no arquivo?
Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))
python
docker
dockerfile
Prometeu
fonte
fonte
docker build
(e suaDockerfile
). Presumivelmente, é uma etapa anterior em seu processo de compilação que está invadindo o cache, fazendo com que esta etapa seja executada.Respostas:
Estou supondo que, em algum ponto do processo de compilação, você está copiando todo o seu aplicativo para a imagem do Docker com
COPY
ouADD
:O problema é que você está invalidando o cache de compilação do Docker sempre que copia o aplicativo inteiro na imagem. Isso também invalidará o cache para todas as etapas de construção subsequentes.
Para evitar isso, sugiro copiar apenas o
requirements.txt
arquivo em uma etapa de compilação separada antes de adicionar o aplicativo inteiro à imagem:COPY requirements.txt /opt/app/requirements.txt WORKDIR /opt/app RUN pip install -r requirements.txt COPY . /opt/app # continue as before...
Como o arquivo de requisitos em si provavelmente muda apenas raramente, você poderá usar as camadas em cache até o ponto em que adicionar o código do aplicativo à imagem.
fonte
COPY
seja preferível, aADD
menos que você precise especificamente do comportamento deADD
.ADD
só é necessário se a<src>
pasta contiver algum arquivo que precise ser descompactado ou que precise suportar o tratamento remoto de URL. {código-fonte}Isso é mencionado diretamente nas " Práticas recomendadas para escrever Dockerfiles " do próprio Docker :
fonte
Alternativamente, como um meio mais rápido de executar o arquivo requirements.txt sem digitar "sim" para confirmar a instalação das bibliotecas, você pode reescrever como:
COPY requirements.txt ./ RUN pip install -y -r requirements.txt COPY ./"dir"/* .
fonte