We have a python project, and the current docker build takes 350s. Here is the current Dockerfile
FROM python:3.9
RUN apt-get update && \
apt-get install -y python2.7
WORKDIR /var/app
COPY . .
RUN pip install
ENTRYPOINT ["python3", "/var/app/src/main.py"]
This took 350s on every docker build
There was obvious room for improvement here so, I changed it to this
FROM python:3.9
RUN apt-get update && \
apt-get install -y python2.7
WORKDIR /var/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
RUN pip install
ENTRYPOINT ["python3", "/var/app/src/main.py"]
This brings subsequent build down to 1s
I also came across the following after a bit of searching,
FROM python:3.9
RUN apt-get update && \
apt-get install -y python2.7
WORKDIR /var/app
COPY requirements.txt .
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
COPY . .
RUN pip install
ENTRYPOINT ["python3", "/var/app/src/main.py"]
This takes a bit longer around 80s but better than the 1st one
- What I don't understand is what are the caveats with #2 (to be safe).
- When should I use #3
I have no experience with pip/docker fyi
With #2, as a side effect of docker caching layers, if any of my dependencies dependency version changes, because of using range operators, then I still won't rebuild anything. Is that what #3 is trying to solve? i.e. it will reuse cache as much as it can but also makes sure to update anything necessary
If not, I have no idea what's going on with #3. Is the /root/.cache/pip
a pip specific directory or it can be anything?