Problem installing packages in multi-stage Dockerfile in the final stage

Viewed 18

I want to create a minimal docker image. For that purpose I am using the following multi-stage build dockerfile.

FROM python:3.9-slim as base

ENV LANG=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    PYTHONDONTWRITEBYTECODE=1 \
    PYTHONFAULTHANDLER=1 \
    PYTHONHASHSEED=random \
    PYTHONUNBUFFERED=1

WORKDIR /app

FROM base as builder

ENV PIP_DEFAULT_TIMEOUT=100 \
    PIP_DISABLE_PIP_VERSION_CHECK=1 \
    PIP_NO_CACHE_DIR=1 \
    POETRY_VERSION=1.1.13

COPY pyproject.toml poetry.lock ./

RUN apt-get update && \
    apt-get install make build-essential libssl-dev zlib1g-dev \
    libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
    libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev \
    libffi-dev liblzma-dev python3.9-venv --yes && \
    pip install "poetry==$POETRY_VERSION" && \
    python -m venv /venv && \
    poetry export -f requirements.txt | /venv/bin/pip install -r /dev/stdin

COPY . /app
RUN poetry build && /venv/bin/pip install dist/*.whl

FROM base as final

ENV PATH=/venv/bin:$PATH

COPY --from=builder /venv /venv

RUN apt-get update && apt-get install -y procps curl

# for prometheus
EXPOSE 9090

CMD ["my_command"]

However, no matter where I put the final install command in the final stage the commands are not found in the final image.

RUN apt-get update && apt-get install -y procps curl

I have tried putting it before and after the COPY and ENV and still nothing...

Finally, I added another stage between base and builder just to run this command and then everything works fine.

It's bugging me why this would be the case though. Any ideas what's wrong with the dockerfile above?

0 Answers
Related