build: optimize docker build by better utilizing build cache (#21583)

Co-authored-by: Peng Wang <pwang@williamblair.com>
Co-authored-by: EugeneTorap <evgenykrutpro@gmail.com>
This commit is contained in:
Peng Wang 2022-10-06 10:08:10 -05:00 committed by GitHub
parent f1fbaf8244
commit 041c54e656
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 41 deletions

View File

@ -15,36 +15,10 @@
# limitations under the License.
#
######################################################################
# PY stage that simply does a pip install on our requirements
######################################################################
ARG PY_VER=3.8.13-slim
FROM python:${PY_VER} AS superset-py
RUN mkdir /app \
&& apt-get update -y \
&& apt-get install -y --no-install-recommends \
build-essential \
default-libmysqlclient-dev \
libpq-dev \
libsasl2-dev \
libecpg-dev \
&& rm -rf /var/lib/apt/lists/*
# First, we just wanna install requirements, which will allow us to utilize the cache
# in order to only build if and only if requirements change
COPY ./requirements/*.txt /app/requirements/
COPY setup.py MANIFEST.in README.md /app/
COPY superset-frontend/package.json /app/superset-frontend/
RUN cd /app \
&& mkdir -p superset/static \
&& touch superset/static/version_info.json \
&& pip install --no-cache -r requirements/local.txt
######################################################################
# Node stage to deal with static asset construction
######################################################################
ARG PY_VER=3.8.13-slim
FROM node:16-slim AS superset-node
ARG NPM_BUILD_CMD="build"
@ -52,23 +26,23 @@ ENV BUILD_CMD=${NPM_BUILD_CMD}
# NPM ci first, as to NOT invalidate previous steps except for when package.json changes
RUN mkdir -p /app/superset-frontend
RUN mkdir -p /app/superset/assets
COPY ./docker/frontend-mem-nag.sh /
COPY ./superset-frontend /app/superset-frontend
RUN /frontend-mem-nag.sh \
&& cd /app/superset-frontend \
&& npm ci
RUN /frontend-mem-nag.sh
WORKDIR /app/superset-frontend/
COPY superset-frontend/package*.json ./
RUN npm ci
COPY ./superset-frontend .
# This seems to be the most expensive step
RUN cd /app/superset-frontend \
&& npm run ${BUILD_CMD} \
&& rm -rf node_modules
RUN npm run ${BUILD_CMD}
######################################################################
# Final lean image...
######################################################################
ARG PY_VER=3.8.13-slim
FROM python:${PY_VER} AS lean
ENV LANG=C.UTF-8 \
@ -85,16 +59,24 @@ RUN mkdir -p ${PYTHONPATH} \
&& apt-get install -y --no-install-recommends \
build-essential \
default-libmysqlclient-dev \
libsasl2-dev \
libsasl2-modules-gssapi-mit \
libpq-dev \
libecpg-dev \
&& rm -rf /var/lib/apt/lists/*
COPY --from=superset-py /usr/local/lib/python3.8/site-packages/ /usr/local/lib/python3.8/site-packages/
# Copying site-packages doesn't move the CLIs, so let's copy them one by one
COPY --from=superset-py /usr/local/bin/gunicorn /usr/local/bin/celery /usr/local/bin/flask /usr/bin/
COPY ./requirements/*.txt /app/requirements/
COPY setup.py MANIFEST.in README.md /app/
# setup.py uses the version information in package.json
COPY superset-frontend/package.json /app/superset-frontend/
RUN cd /app \
&& mkdir -p superset/static \
&& touch superset/static/version_info.json \
&& pip install --no-cache -r requirements/local.txt
COPY --from=superset-node /app/superset/static/assets /app/superset/static/assets
COPY --from=superset-node /app/superset-frontend /app/superset-frontend
## Lastly, let's install superset itself
COPY superset /app/superset