diff --git a/Dockerfile b/Dockerfile index b7732f602e..754f23d5bd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,22 +25,18 @@ ARG BUILDPLATFORM=${BUILDPLATFORM:-amd64} FROM --platform=${BUILDPLATFORM} node:16-slim AS superset-node ARG NPM_BUILD_CMD="build" -ENV BUILD_CMD=${NPM_BUILD_CMD} -ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true - +ENV BUILD_CMD=${NPM_BUILD_CMD} \ + PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true # NPM ci first, as to NOT invalidate previous steps except for when package.json changes WORKDIR /app/superset-frontend -COPY ./docker/frontend-mem-nag.sh / - -RUN /frontend-mem-nag.sh +RUN --mount=type=bind,target=/frontend-mem-nag.sh,src=./docker/frontend-mem-nag.sh \ + /frontend-mem-nag.sh COPY superset-frontend/package*.json ./ - RUN npm ci COPY ./superset-frontend ./ - # This seems to be the most expensive step RUN npm run ${BUILD_CMD} @@ -58,7 +54,7 @@ ENV LANG=C.UTF-8 \ SUPERSET_HOME="/app/superset_home" \ SUPERSET_PORT=8088 -RUN mkdir -p ${PYTHONPATH} \ +RUN mkdir -p ${PYTHONPATH} superset/static superset-frontend apache_superset.egg-info requirements \ && useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash superset \ && apt-get update -q \ && apt-get install -yq --no-install-recommends \ @@ -70,24 +66,22 @@ RUN mkdir -p ${PYTHONPATH} \ libpq-dev \ libecpg-dev \ libldap2-dev \ - && rm -rf /var/lib/apt/lists/* + && apt-get autoremove -yqq --purge && rm -rf /var/lib/apt/lists/* /var/[log,tmp]/* /tmp/* && apt-get clean \ + && touch superset/static/version_info.json \ + && chown -R superset:superset ./* -COPY --chown=superset:superset ./requirements/*.txt requirements/ +COPY --chown=superset:superset ./requirements/*.txt requirements/ COPY --chown=superset:superset setup.py MANIFEST.in README.md ./ # setup.py uses the version information in package.json COPY --chown=superset:superset superset-frontend/package.json superset-frontend/ - -RUN mkdir -p superset/static \ - && touch superset/static/version_info.json \ - && pip install --no-cache-dir -r requirements/local.txt +RUN pip install --no-cache-dir -r requirements/local.txt COPY --chown=superset:superset --from=superset-node /app/superset/static/assets superset/static/assets ## Lastly, let's install superset itself COPY --chown=superset:superset superset superset - -RUN chown -R superset:superset ./* \ - && pip install --no-cache-dir -e . \ - && flask fab babel-compile --target superset/translations +RUN pip install --no-cache-dir -e . \ + && flask fab babel-compile --target superset/translations \ + && chown -R superset:superset superset/translations COPY --chmod=755 ./docker/run-server.sh /usr/bin/ USER superset @@ -102,8 +96,8 @@ CMD ["/usr/bin/run-server.sh"] # Dev image... ###################################################################### FROM lean AS dev -ARG GECKODRIVER_VERSION=v0.32.0 -ARG FIREFOX_VERSION=106.0.3 +ARG GECKODRIVER_VERSION=v0.32.0 \ + FIREFOX_VERSION=106.0.3 USER root @@ -121,12 +115,10 @@ RUN apt-get update -q \ # Install Firefox && wget https://download-installer.cdn.mozilla.net/pub/firefox/releases/${FIREFOX_VERSION}/linux-x86_64/en-US/firefox-${FIREFOX_VERSION}.tar.bz2 -O - | tar xfj - -C /opt \ && ln -s /opt/firefox/firefox /usr/local/bin/firefox \ - && apt-get autoremove -yqq --purge wget && rm -rf /var/lib/apt/lists/* && apt-get clean + && apt-get autoremove -yqq --purge wget && rm -rf /var/lib/apt/lists/* /var/[log,tmp]/* /tmp/* && apt-get clean -COPY ./requirements/*.txt ./docker/requirements-*.txt/ /app/requirements/ # Cache everything for dev purposes... -RUN pip install --no-cache-dir -r /app/requirements/docker.txt \ - && pip install --no-cache-dir -r /app/requirements/requirements-local.txt || true +RUN pip install --no-cache-dir -r requirements/docker.txt USER superset ###################################################################### @@ -134,6 +126,6 @@ USER superset ###################################################################### FROM lean AS ci -COPY --chown=superset --chmod=755 ./docker/*.sh /app/docker/ +COPY --chown=superset:superset --chmod=755 ./docker/*.sh /app/docker/ CMD ["/app/docker/docker-ci.sh"]