fix: eph env + improve docker images to run in userspace (#32017)

This commit is contained in:
Maxime Beauchemin 2025-01-29 10:01:40 -08:00 committed by GitHub
parent e4bdb28ba2
commit 732de4ac7f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 41 additions and 38 deletions

1
.gitignore vendored
View File

@ -124,3 +124,4 @@ docker/*local*
# Jest test report # Jest test report
test-report.html test-report.html
superset/static/stats/statistics.html superset/static/stats/statistics.html
.aider*

View File

@ -76,8 +76,7 @@ COPY superset-frontend /app/superset-frontend
FROM superset-node-ci AS superset-node FROM superset-node-ci AS superset-node
# Build the frontend if not in dev mode # Build the frontend if not in dev mode
RUN --mount=type=cache,target=/app/superset-frontend/.temp_cache \ RUN --mount=type=cache,target=/root/.npm \
--mount=type=cache,target=/root/.npm \
if [ "$DEV_MODE" = "false" ]; then \ if [ "$DEV_MODE" = "false" ]; then \
echo "Running 'npm run ${BUILD_CMD}'"; \ echo "Running 'npm run ${BUILD_CMD}'"; \
npm run ${BUILD_CMD}; \ npm run ${BUILD_CMD}; \
@ -100,21 +99,14 @@ RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
# Base python layer # Base python layer
###################################################################### ######################################################################
FROM python:${PY_VER} AS python-base FROM python:${PY_VER} AS python-base
ARG BUILD_TRANSLATIONS="false" # Include translations in the final build
ENV BUILD_TRANSLATIONS=${BUILD_TRANSLATIONS}
ARG DEV_MODE="false" # Skip frontend build in dev mode
ENV DEV_MODE=${DEV_MODE}
ENV LANG=C.UTF-8 \ ARG SUPERSET_HOME="/app/superset_home"
LC_ALL=C.UTF-8 \ ENV SUPERSET_HOME=${SUPERSET_HOME}
SUPERSET_ENV=production \
FLASK_APP="superset.app:create_app()" \
PYTHONPATH="/app/pythonpath" \
SUPERSET_HOME="/app/superset_home" \
SUPERSET_PORT=8088
RUN mkdir -p $SUPERSET_HOME
RUN useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash superset RUN useradd --user-group -d ${SUPERSET_HOME} -m --no-log-init --shell /bin/bash superset \
&& chmod -R 1777 $SUPERSET_HOME \
&& chown -R superset:superset $SUPERSET_HOME
# Some bash scripts needed throughout the layers # Some bash scripts needed throughout the layers
COPY --chmod=755 docker/*.sh /app/docker/ COPY --chmod=755 docker/*.sh /app/docker/
@ -125,19 +117,6 @@ RUN pip install --no-cache-dir --upgrade uv
RUN uv venv /app/.venv RUN uv venv /app/.venv
ENV PATH="/app/.venv/bin:${PATH}" ENV PATH="/app/.venv/bin:${PATH}"
# Install Playwright and optionally setup headless browsers
ARG INCLUDE_CHROMIUM="true"
ARG INCLUDE_FIREFOX="false"
RUN --mount=type=cache,target=/root/.cache/uv\
if [ "$INCLUDE_CHROMIUM" = "true" ] || [ "$INCLUDE_FIREFOX" = "true" ]; then \
uv pip install playwright && \
playwright install-deps && \
if [ "$INCLUDE_CHROMIUM" = "true" ]; then playwright install chromium; fi && \
if [ "$INCLUDE_FIREFOX" = "true" ]; then playwright install firefox; fi; \
else \
echo "Skipping browser installation"; \
fi
###################################################################### ######################################################################
# Python translation compiler layer # Python translation compiler layer
###################################################################### ######################################################################
@ -159,13 +138,20 @@ RUN if [ "$BUILD_TRANSLATIONS" = "true" ]; then \
# Python APP common layer # Python APP common layer
###################################################################### ######################################################################
FROM python-base AS python-common FROM python-base AS python-common
ENV SUPERSET_HOME="/app/superset_home" \
HOME="/app/superset_home" \
SUPERSET_ENV="production" \
FLASK_APP="superset.app:create_app()" \
PYTHONPATH="/app/pythonpath" \
SUPERSET_PORT="8088"
# Copy the entrypoints, make them executable in userspace # Copy the entrypoints, make them executable in userspace
COPY --chmod=755 docker/entrypoints /app/docker/entrypoints COPY --chmod=755 docker/entrypoints /app/docker/entrypoints
WORKDIR /app WORKDIR /app
# Set up necessary directories and user # Set up necessary directories and user
RUN mkdir -p \ RUN mkdir -p \
${SUPERSET_HOME} \
${PYTHONPATH} \ ${PYTHONPATH} \
superset/static \ superset/static \
requirements \ requirements \
@ -174,6 +160,19 @@ RUN mkdir -p \
requirements \ requirements \
&& touch superset/static/version_info.json && touch superset/static/version_info.json
# Install Playwright and optionally setup headless browsers
ARG INCLUDE_CHROMIUM="true"
ARG INCLUDE_FIREFOX="false"
RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
if [ "$INCLUDE_CHROMIUM" = "true" ] || [ "$INCLUDE_FIREFOX" = "true" ]; then \
uv pip install playwright && \
playwright install-deps && \
if [ "$INCLUDE_CHROMIUM" = "true" ]; then playwright install chromium; fi && \
if [ "$INCLUDE_FIREFOX" = "true" ]; then playwright install firefox; fi; \
else \
echo "Skipping browser installation"; \
fi
# Copy required files for Python build # Copy required files for Python build
COPY pyproject.toml setup.py MANIFEST.in README.md ./ COPY pyproject.toml setup.py MANIFEST.in README.md ./
COPY superset-frontend/package.json superset-frontend/ COPY superset-frontend/package.json superset-frontend/
@ -214,12 +213,11 @@ FROM python-common AS lean
# Install Python dependencies using docker/pip-install.sh # Install Python dependencies using docker/pip-install.sh
COPY requirements/base.txt requirements/ COPY requirements/base.txt requirements/
RUN --mount=type=cache,target=/root/.cache/uv \ RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
/app/docker/pip-install.sh --requires-build-essential -r requirements/base.txt /app/docker/pip-install.sh --requires-build-essential -r requirements/base.txt
# Install the superset package # Install the superset package
RUN --mount=type=cache,target=/root/.cache/uv \ RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
uv pip install . uv pip install .
RUN python -m compileall /app/superset RUN python -m compileall /app/superset
USER superset USER superset
@ -238,12 +236,13 @@ RUN /app/docker/apt-install.sh \
# Copy development requirements and install them # Copy development requirements and install them
COPY requirements/*.txt requirements/ COPY requirements/*.txt requirements/
# Install Python dependencies using docker/pip-install.sh # Install Python dependencies using docker/pip-install.sh
RUN --mount=type=cache,target=/root/.cache/uv \ RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
/app/docker/pip-install.sh --requires-build-essential -r requirements/development.txt /app/docker/pip-install.sh --requires-build-essential -r requirements/development.txt
# Install the superset package # Install the superset package
RUN --mount=type=cache,target=/root/.cache/uv \ RUN --mount=type=cache,target=${SUPERSET_HOME}/.cache/uv \
uv pip install . uv pip install .
RUN uv pip install .[postgres]
RUN python -m compileall /app/superset RUN python -m compileall /app/superset
USER superset USER superset
@ -252,5 +251,7 @@ USER superset
# CI image... # CI image...
###################################################################### ######################################################################
FROM lean AS ci FROM lean AS ci
USER root
RUN uv pip install .[postgres]
USER superset
CMD ["/app/docker/entrypoints/docker-ci.sh"] CMD ["/app/docker/entrypoints/docker-ci.sh"]

View File

@ -20,7 +20,7 @@ set -eo pipefail
# Make python interactive # Make python interactive
if [ "$DEV_MODE" == "true" ]; then if [ "$DEV_MODE" == "true" ]; then
if command -v uv > /dev/null 2>&1; then if [ "$(whoami)" = "root" ] && command -v uv > /dev/null 2>&1; then
echo "Reinstalling the app in editable mode" echo "Reinstalling the app in editable mode"
uv pip install -e . uv pip install -e .
fi fi
@ -34,7 +34,8 @@ if [ "$CYPRESS_CONFIG" == "true" ]; then
export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset_cypress export SUPERSET__SQLALCHEMY_DATABASE_URI=postgresql+psycopg2://superset:superset@db:5432/superset_cypress
PORT=8081 PORT=8081
fi fi
if [[ "$DATABASE_DIALECT" == postgres* ]] ; then if [[ "$DATABASE_DIALECT" == postgres* ]] && [ "$(whoami)" = "root" ]; then
# older images may not have the postgres dev requirements installed
echo "Installing postgres requirements" echo "Installing postgres requirements"
if command -v uv > /dev/null 2>&1; then if command -v uv > /dev/null 2>&1; then
# Use uv in newer images # Use uv in newer images

View File

@ -23,4 +23,4 @@
export SERVER_THREADS_AMOUNT=8 export SERVER_THREADS_AMOUNT=8
# start up the web server # start up the web server
/usr/bin/run-server.sh /app/docker/entrypoints/run-server.sh