Install build-essential in Docker image without having to do `apt-get update`?

10,476

Solution 1

create a base image which containes :

FROM python:3.7-slim

RUN apt-get update && apt-get install build-essential -y

build it :

docker build -t mybase .

then use it for new images:

FROM mybase

Solution 2

"Is there a way to install build-essential in my Dockerfile in a layer which doesn't constantly change?"

Even the question "having some age", is a case in which the construction of the image can be used in multiple stages. The code below uses an example with a Python App.

# first stage
FROM python:3.8 AS builder
COPY requirements.txt .

# install dependencies to the local user directory (eg. /root/.local)
RUN pip install --user -r requirements.txt

# second unnamed stage
FROM python:3.8-slim
WORKDIR /code

# copy only the dependencies installation from the 1st stage image
COPY --from=builder /root/.local /root/.local
COPY ./src .

# update PATH environment variable
ENV PATH=/root/.local:$PATH

CMD [ "python", "./server.py" ]

I hope it will be useful.

src: Containerized Python Development – Part 1

Share:
10,476
EuRBamarth
Author by

EuRBamarth

Updated on June 05, 2022

Comments

  • EuRBamarth
    EuRBamarth about 2 years

    I have a Dockerfile which starts with the following:

    FROM python:3.7-slim
    
    RUN apt-get update && apt-get install build-essential -y
    

    Problem is, this layer is always changing, so when I run docker build -t <mytag> ., this layer (and subsequent ones) run again, which takes up significant time.

    Is there a way to install build-essential in my Dockerfile in a layer which doesn't constantly change?


    EDIT: I had a COPY line before RUN, which I removed from the question as I didn't want to include the names of private files, but it didn't occur to me that that was what was making the build re-run from this step.