diff --git a/Dockerfile b/Dockerfile index 0782d122b..4a4b27682 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,96 +1,49 @@ -FROM alpine:3.20 -ENTRYPOINT ["/sbin/tini","--","/usr/local/searxng/dockerfiles/docker-entrypoint.sh"] -EXPOSE 8080 -VOLUME /etc/searxng -ARG SEARXNG_GID=977 -ARG SEARXNG_UID=977 +FROM python:3.9-slim -RUN addgroup -g ${SEARXNG_GID} searxng && \ - adduser -u ${SEARXNG_UID} -D -h /usr/local/searxng -s /bin/sh -G searxng searxng +# Install necessary system dependencies +RUN apt-get update && apt-get install -y \ + python3-dev \ + python3-babel \ + python3-venv \ + uwsgi \ + uwsgi-plugin-python3 \ + git \ + build-essential \ + libxslt-dev \ + zlib1g-dev \ + libffi-dev \ + libssl-dev && \ + apt-get clean && rm -rf /var/lib/apt/lists/* -ENV INSTANCE_NAME=searxng \ - AUTOCOMPLETE= \ - BASE_URL= \ - MORTY_KEY= \ - MORTY_URL= \ - SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \ - UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini \ - UWSGI_WORKERS=%k \ - UWSGI_THREADS=4 +# Create user and directory structure +RUN useradd --shell /bin/bash --system --home-dir /usr/local/searxng --comment 'Privacy-respecting metasearch engine' searxng && \ + mkdir -p /usr/local/searxng && \ + chown -R searxng:searxng /usr/local/searxng +# Switch to non-root user +USER searxng + +# Set working directory WORKDIR /usr/local/searxng -COPY requirements.txt ./requirements.txt +# Clone SearXNG repository +RUN git clone https://github.com/searxng/searxng /usr/local/searxng/searxng-src -RUN apk add --no-cache -t build-dependencies \ - build-base \ - py3-setuptools \ - python3-dev \ - libffi-dev \ - libxslt-dev \ - libxml2-dev \ - openssl-dev \ - tar \ - git \ - && apk add --no-cache \ - ca-certificates \ - python3 \ - py3-pip \ - libxml2 \ - libxslt \ - openssl \ - tini \ - uwsgi \ - uwsgi-python3 \ - brotli +# Set up Python virtual environment +RUN python3 -m venv /usr/local/searxng/searx-pyenv && \ + echo "source /usr/local/searxng/searx-pyenv/bin/activate" >> ~/.bashrc -# For 32bit arm architecture install pydantic from the alpine repos instead of requirements.txt -ARG TARGETARCH -RUN if [ "$TARGETARCH" = "arm" ]; then \ - apk add --no-cache py3-pydantic && pip install --no-cache --break-system-packages -r <(grep -v '^pydantic' requirements.txt); \ - else \ - pip install --no-cache --break-system-packages -r requirements.txt; \ - fi - RUN apk del build-dependencies \ - && rm -rf /root/.cache +# Activate virtual environment and install dependencies +RUN /usr/local/searxng/searx-pyenv/bin/pip install -U pip setuptools wheel pyyaml && \ + cd /usr/local/searxng/searxng-src && \ + /usr/local/searxng/searx-pyenv/bin/pip install --use-pep517 --no-build-isolation -r /app/requirements.txt -COPY --chown=searxng:searxng dockerfiles ./dockerfiles -COPY --chown=searxng:searxng searx ./searx +# Install additional dependencies +RUN /usr/local/searxng/searx-pyenv/bin/pip install uwsgi -ARG TIMESTAMP_SETTINGS=0 -ARG TIMESTAMP_UWSGI=0 -ARG VERSION_GITCOMMIT=unknown +# Expose the port +EXPOSE 8888 -RUN su searxng -c "/usr/bin/python3 -m compileall -q searx" \ - && touch -c --date=@${TIMESTAMP_SETTINGS} searx/settings.yml \ - && touch -c --date=@${TIMESTAMP_UWSGI} dockerfiles/uwsgi.ini \ - && find /usr/local/searxng/searx/static -a \( -name '*.html' -o -name '*.css' -o -name '*.js' \ - -o -name '*.svg' -o -name '*.ttf' -o -name '*.eot' \) \ - -type f -exec gzip -9 -k {} \+ -exec brotli --best {} \+ - -# Keep these arguments at the end to prevent redundant layer rebuilds -ARG LABEL_DATE= -ARG GIT_URL=unknown -ARG SEARXNG_GIT_VERSION=unknown -ARG SEARXNG_DOCKER_TAG=unknown -ARG LABEL_VCS_REF= -ARG LABEL_VCS_URL= -LABEL maintainer="searxng <${GIT_URL}>" \ - description="A privacy-respecting, hackable metasearch engine." \ - version="${SEARXNG_GIT_VERSION}" \ - org.label-schema.schema-version="1.0" \ - org.label-schema.name="searxng" \ - org.label-schema.version="${SEARXNG_GIT_VERSION}" \ - org.label-schema.url="${LABEL_VCS_URL}" \ - org.label-schema.vcs-ref=${LABEL_VCS_REF} \ - org.label-schema.vcs-url=${LABEL_VCS_URL} \ - org.label-schema.build-date="${LABEL_DATE}" \ - org.label-schema.usage="https://github.com/searxng/searxng-docker" \ - org.opencontainers.image.title="searxng" \ - org.opencontainers.image.version="${SEARXNG_DOCKER_TAG}" \ - org.opencontainers.image.url="${LABEL_VCS_URL}" \ - org.opencontainers.image.revision=${LABEL_VCS_REF} \ - org.opencontainers.image.source=${LABEL_VCS_URL} \ - org.opencontainers.image.created="${LABEL_DATE}" \ - org.opencontainers.image.documentation="https://github.com/searxng/searxng-docker" +# Start the application +CMD ["sh", "-c", "source /usr/local/searxng/searx-pyenv/bin/activate && python searx/webapp.py"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a6bd4cb1c..7062a88e2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,4 +13,4 @@ services: volumes: - ./settings.yml:/etc/searxng/settings.yml - ./requirements.txt:/app/requirements.txt - command: ["sh", "-c", "source /usr/local/searxng/searx-pyenv/bin/activate && python searx/webapp.py"] + command: ["sh", "-c", "source /usr/local/searxng/searx-pyenv/bin/activate && python searx/webapp.py"] \ No newline at end of file