From 041c54e65693bc22631dd49352971cb697d53d1a Mon Sep 17 00:00:00 2001 From: Peng Wang Date: Thu, 6 Oct 2022 10:08:10 -0500 Subject: [PATCH] build: optimize docker build by better utilizing build cache (#21583) Co-authored-by: Peng Wang Co-authored-by: EugeneTorap --- Dockerfile | 64 ++++++++++++++++++++---------------------------------- 1 file changed, 23 insertions(+), 41 deletions(-) diff --git a/Dockerfile b/Dockerfile index faf1d29c51cdb..ee6c5d9402d8e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 -# This seems to be the most expensive step -RUN cd /app/superset-frontend \ - && npm run ${BUILD_CMD} \ - && rm -rf node_modules +WORKDIR /app/superset-frontend/ +COPY superset-frontend/package*.json ./ +RUN npm ci + +COPY ./superset-frontend . + +# This seems to be the most expensive step +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