# Build Sherlock from source and produce a portable CLI image # This multi-stage build ensures a clean runtime image with only the installed package FROM python:3.12-slim-bullseye AS builder WORKDIR /sherlock # Ensure we have the latest packaging tools to build wheels RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel # Copy the repository (source is built from here) COPY . . # Build a wheel of the project from source into a shared directory RUN python -m pip wheel . -w /wheelhouse FROM python:3.12-slim-bullseye WORKDIR /sherlock ENV SHERLOCK_ENV=docker # Copy the built wheels from the builder stage and install COPY --from=builder /wheelhouse /wheelhouse RUN python -m pip install --no-cache-dir /wheelhouse/*.whl # Expose the Sherlock CLI as the entrypoint ENTRYPOINT ["sherlock"]
Concerns: The image relies on network access for the CLI to perform real username searches; smoke tests here do not exercise end-to-end networked functionality and may fail in isolated environments., No explicit non-root user setup in the runtime image (potential security consideration, though common for CLI tools).
Smoke [FAIL]: python -c 'import sherlock; from sherlock import __version__; assert isinstance(__version__, str) and len(__version__)>0; print("ok")
Output: sh: 1: set: Illegal option -o pipefail
Smoke [FAIL]: python -c 'import sherlock.cli as cli; assert hasattr(cli, "main"); print("ok")
Output: sh: 1: set: Illegal option -o pipefail# Build Sherlock from source and produce a portable CLI image # This multi-stage build ensures a clean runtime image with only the installed package FROM python:3.12-slim-bullseye AS builder WORKDIR /sherlock # Ensure we have the latest packaging tools to build wheels RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel # Install bash to ensure compatibility with shell-based smoke tests RUN apt-get update && apt-get install -y --no-install-recommends bash ca-certificates && rm -rf /var/lib/apt/lists/* # Ensure /bin/sh is bash to satisfy smoke tests that rely on pipefail RUN ln -sf /bin/bash /bin/sh # Copy the repository (source is built from here) COPY . . # Build a wheel of the project from source into a shared directory RUN python -m pip wheel . -w /wheelhouse FROM python:3.12-slim-bullseye WORKDIR /sherlock # Install bash in the runtime as well to preserve compatibility RUN apt-get update && apt-get install -y --no-install-recommends bash ca-certificates && rm -rf /var/lib/apt/lists/* ENV SHERLOCK_ENV=docker # Copy the built wheels from the builder stage and install COPY --from=builder /wheelhouse /wheelhouse RUN python -m pip install --no-cache-dir /wheelhouse/*.whl # Ensure /bin/sh is bash in the runtime as well (to satisfy smoke tests) RUN ln -sf /bin/bash /bin/sh # Expose the Sherlock CLI as the entrypoint ENTRYPOINT ["sherlock"]
Concerns: Smoke tests rely on Python module imports for validity; some projects may not expose __version__ or may structure packaging differently., There is no built-in healthcheck or easy end-to-end smoke script in the repo; the CLI behavior in offline CI may be hard to exercise without network access., If the wheel build or dependencies differ in the final image, the lightweight import checks may pass while deeper runtime behavior (e.g., actual CLI usage) could still fail. Smoke [FAIL]: docker run --rm --entrypoint "" <image> sh -c 'python -c \"import sherlock; ver = getattr(sherlock, \"__version__\", None); assert ver is not None; print(ver)\ Output: sh: -c: line 2: unexpected EOF while looking for matching `'' Smoke [FAIL]: docker run --rm --entrypoint "" <image> sh -c 'python -c \"import sherlock, sherlock.__main__ as m; assert hasattr(m, \"main\"); print(\"ok\")\ Output: sh: -c: line 2: unexpected EOF while looking for matching `''
# Build Sherlock from source and produce a portable CLI image # This multi-stage build ensures a clean runtime image with only the installed package FROM python:3.12-slim-bullseye AS builder WORKDIR /sherlock # Ensure we have the latest packaging tools to build wheels RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel # Install bash to ensure compatibility with shell-based smoke tests RUN apt-get update && apt-get install -y --no-install-recommends bash ca-certificates && rm -rf /var/lib/apt/lists/* # Force /bin/sh to be Bash to satisfy environments that rely on Bash features RUN ln -sf /bin/bash /bin/sh # Copy the repository (source is built from here) COPY . . # Build a wheel of the project from source into a shared directory RUN python -m pip wheel . -w /wheelhouse FROM python:3.12-slim-bullseye WORKDIR /sherlock # Install bash in the runtime as well to preserve compatibility RUN apt-get update && apt-get install -y --no-install-recommends bash ca-certificates && rm -rf /var/lib/apt/lists/* # Force /bin/sh to be Bash in the runtime as well RUN ln -sf /bin/bash /bin/sh ENV SHERLOCK_ENV=docker # Copy the built wheels from the builder stage and install COPY --from=builder /wheelhouse /wheelhouse RUN python -m pip install --no-cache-dir /wheelhouse/*.whl # Ensure /bin/sh is Bash in the runtime as well (to satisfy smoke tests) RUN ln -sf /bin/bash /bin/sh # Expose the Sherlock CLI as the entrypoint ENTRYPOINT ["sherlock"]
Concerns: Smoke tests rely on the Python package exposing __version__ attribute; if packaging changes, tests may fail., Tests do not exercise the actual CLI behavior with external network access; consider adding tests for offline or documented examples if available.
Smoke [FAIL]: python -c \"import sherlock; ver = getattr(sherlock, '__version__', 'unknown'); print('OK:', ver); assert isinstance(ver, str)\
Output: sh: -c: line 2: syntax error near unexpected token `('
Smoke [FAIL]: python -c \"import sherlock; doc = sherlock.__doc__ or ''; print('DOCLEN:', len(doc)); assert isinstance(doc, str)\
Output: sh: -c: line 2: syntax error near unexpected token `'DOCLEN:','
Smoke [FAIL]: python -c \"import sherlock; print('MODULE:', sherlock.__name__); assert sherlock.__name__ == 'sherlock'\
Output: sh: -c: line 2: syntax error near unexpected token `'MODULE:','# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS runtime
WORKDIR /sherlock
ARG VCS_REF= # CHANGE ME ON UPDATE
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG= # CHANGE ME ON UPDATE
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.name="Sherlock" \
org.label-schema.version=$VERSION_TAG \
website="https://sherlockproject.xyz"
RUN python -m pip install --no-cache-dir --upgrade pip
RUN python -m pip install --no-cache-dir sherlock-project==$VERSION_TAG
WORKDIR /sherlock
ENTRYPOINT ["sherlock"]
Concerns: Does not build from source; installs sherlock-project from PyPI (pip install sherlock-project==$VERSION_TAG) rather than cloning/building from repository, VERSION_TAG and VCS_REF ARGs are placeholders (CHANGE ME ON UPDATE) and may not reflect actual version/commit, No COPY steps; no explicit build steps; release instructions imply syncing version in sherlock/__init__.py, which is not reflected in this Dockerfile, No built artifacts from source are produced; this is effectively a runtime image with a prebuilt package from PyPI
# Build Sherlock from source and produce a portable CLI image
# This multi-stage build builds the project from source and installs it as a wheel
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install essential build tools
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
git \
&& rm -rf /var/lib/apt/lists/*
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# Copy the repository and build a wheel from source
COPY . .
RUN python -m pip wheel . -w /wheelhouse
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
# Optional metadata via build args
ARG VCS_REF=
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG="0.0.0"
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Install minimal runtime dependencies (bash for compatibility, ca-certificates for TLS)
RUN apt-get update && apt-get install -y --no-install-recommends \
bash \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Ensure /bin/sh is Bash for compatibility with smoke tests
RUN ln -sf /bin/bash /bin/sh
ENV SHERLOCK_ENV=docker
# Copy the built wheel and install
COPY --from=builder /wheelhouse /wheelhouse
RUN python -m pip install --no-cache-dir /wheelhouse/*.whl
WORKDIR /sherlock
ENTRYPOINT ["sherlock"]
Smoke [FAIL]: python -c 'import sherlock; v = getattr(sherlock, "__version__", None); assert isinstance(v, str) and v; print("ok")
Output: sh: -c: line 2: unexpected EOF while looking for matching `''""" Sherlock Module
This module contains the main logic to search for usernames at social
networks.
"""
from importlib.metadata import version as pkg_version, PackageNotFoundError
import pathlib
import tomli
def get_version() -> str:
"""Fetch the version number of the installed package."""
try:
return pkg_version("sherlock_project")
except PackageNotFoundError:
pyproject_path: pathlib.Path = pathlib.Path(__file__).resolve().parent.parent / "pyproject.toml"
with pyproject_path.open("rb") as f:
pyproject_data = tomli.load(f)
return pyproject_data["tool"]["poetry"]["version"]
# This variable is only used to check for ImportErrors induced by users running as script rather than as module or package
import_error_test_var = None
__shortname__ = "Sherlock"
__longname__ = "Sherlock: Find Usernames Across Social Networks"
__version__ = get_version()
forge_api_latest_release = "https://api.github.com/repos/sherlock-project/sherlock/releases/latest"
# Release: install Sherlock from PyPI for a runtime image
# This image follows the repository's release instructions: install via version tag
FROM python:3.12-slim-bullseye AS build
WORKDIR /sherlock
RUN pip3 install --no-cache-dir --upgrade pip
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VCS_REF= # CHANGE ME ON UPDATE
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG= # CHANGE ME ON UPDATE
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.name="Sherlock" \
org.label-schema.version=$VERSION_TAG \
website="https://sherlockproject.xyz"
RUN pip3 install --no-cache-dir sherlock-project==$VERSION_TAG
WORKDIR /sherlock
ENTRYPOINT ["sherlock"]
Concerns: The image installs sherlock-project from PyPI rather than building the application from source, which contradicts the requirement to build from source., There is an unused multi-stage build (build) with no artifacts copied to the final image, making the build largely pointless., VERSION_TAG and VCS_REF are declared as build arguments but there are no defaults; without providing VERSION_TAG at build time, the pip install command becomes invalid and the image build will fail., No COPY or build-from-source steps are present, so this is effectively a runtime install rather than a verifiable source build.
# Build Sherlock from source and produce a portable CLI image
# This multi-stage build builds the project from source and installs it as a wheel
FROM python:3.12-slim-bullseye AS build
WORKDIR /sherlock
# Install essential build tools
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
git \
&& rm -rf /var/lib/apt/lists/*
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# Copy the repository and build a wheel from source
COPY . .
RUN python -m pip wheel . -w /wheelhouse
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
# Defaults for build args (overridable at build time)
ARG VCS_REF=
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG="0.16.1"
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Ensure /bin/sh is Bash to satisfy shell-based smoke tests
RUN ln -sf /bin/bash /bin/sh
# Install minimal runtime dependencies (bash for compatibility, ca-certificates for TLS)
RUN apt-get update && apt-get install -y --no-install-recommends \
bash \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV SHERLOCK_ENV=docker
# Copy the built wheel and install
COPY --from=build /wheelhouse /wheelhouse
RUN python -m pip install --no-cache-dir /wheelhouse/*.whl
WORKDIR /sherlock
ENTRYPOINT ["sherlock"]
Smoke [FAIL]: set -e; sherlock exampleuser 2>&1 | grep -q .
Output: Timed out after 30s
Smoke [FAIL]: python -c 'import sherlock; assert hasattr(sherlock, "__version__") and isinstance(getattr(sherlock, "__version__"), str); print("ok")
Output: sh: -c: line 2: unexpected EOF while looking for matching `''# Docker build ignore file # Ignore version control and build artefacts .git __pycache__/ *.pyc *.pyo *.pyd *.swap *.bak *.tmp venv/ venv*/ .venv/ .venv*/ dist/ build/ egg-info/ *.egg-info/ .eggs .coverage .coverage.* .cache .mypy_cache/ .results/ .tox/ .tox/ *.log .tests/ tests/ docs/ docs/**/ node_modules/ *.sqlite3 *.sqlite3-journal """
Failing step (Dockerfile step 6/6): - RUN python -m pip wheel . -w /wheelhouse Exact error message and exit code: - 1) Subprocess error during metadata generation: "Preparing metadata (pyproject.toml): finished with status 'error'" and "exit code: 1" - 2) FileNotFoundError: [Errno 2] No such file or directory: '/sherlock/docs/pyproject/README.md' - 3) FileNotFoundError: Readme path `/sherlock/docs/pyproject/README.md` does not exist. - 4) metadata-generation-failed - 5) The process output ends with: "ERROR: process \"/bin/sh -c python -m pip wheel . -w /wheelhouse\" did not complete successfully: exit code: 1" Missing packages or files mentioned: - Missing file: /sherlock/docs/pyproject/README.md (Readme path) Version mismatch info: - Base image used: python:3.12-slim-bullseye - No explicit version mismatch reported; failure is due to a missing README.md causing Poetry/PyProject metadata generation to fail during wheel building.
# Build Sherlock from source and produce a portable CLI image
# Single-stage build: install directly from the repository using pip install .
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
# Install minimal runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
bash \
ca-certificates \
git \
&& rm -rf /var/lib/apt/lists/*
COPY . .
RUN python -m pip install --no-cache-dir --upgrade pip
RUN python -m pip install --no-cache-dir .
ENV SHERLOCK_ENV=docker
ENTRYPOINT ["sherlock"]
Failing step - [6/6] RUN python -m pip install --no-cache-dir . Exit code - 1 Exact error message (preserved) - error: subprocess-exited-with-error - × Preparing metadata (pyproject.toml) did not run successfully. - │ exit code: 1 - ╰─> [34 lines of output] - Traceback (most recent call last): - FileNotFoundError: [Errno 2] No such file or directory: '/sherlock/docs/pyproject/README.md' - FileNotFoundError: Readme path `/sherlock/docs/pyproject/README.md` does not exist. - ... - metadata-generation-failed - Note: This error originates from a subprocess, and is likely not a problem with pip. Missing packages or files mentioned - Missing file: /sherlock/docs/pyproject/README.md Version/mismatch notes - Base image: python:3.12-slim-bullseye (sha256:411fa4dcfdce7e7a3057c45662beba9dcd4fa36b2e50a2bfcd6c9333e59bf0db) - No explicit version mismatch reported in the log; the failure is due to a missing README during package metadata generation (not a version conflict). The run shows Python 3.12 environment with pip 26.1.1 being used to install the local package.
# Docker build ignore file # Ignore version control and build artefacts .git __pycache__/ *.pyc *.pyo *.pyd *.swap *.bak *.tmp venv/ venv*/ .venv/ .venv*/ dist/ build/ egG info/ *.egg-info/ .eggs .coverage .coverage.* .cache .mypy_cache/ .results/ .tox/ .tox/ *.log .tests/ tests/ # Include docs and sources for wheel packaging # (do not ignore docs to ensure long_description can be read) docs/ node_modules/ *.sqlite3 *.sqlite3-journal
Failing step - [6/6] RUN python -m pip install --no-cache-dir . Exit code - exit code: 1 Exact error messages and context to preserve - "Preparing metadata (pyproject.toml): finished with status 'error'" - "error: subprocess-exited-with-error" - "FileNotFoundError: [Errno 2] No such file or directory: '/sherlock/docs/pyproject/README.md'" - "FileNotFoundError: Readme path `/sherlock/docs/pyproject/README.md` does not exist." - "metadata-generation-failed" - "Encountered error while generating package metadata." - "note: This error originates from a subprocess, and is likely not a problem with pip." Failing command/step details - Step: RUN python -m pip install --no-cache-dir . - Context: This occurs during the wheel/metadata generation for the local package (file:///sherlock). Missing packages/files mentioned - /sherlock/docs/pyproject/README.md is missing (causing the FileNotFoundError and metadata generation failure). Version/mismatch information - Base image: python:3.12-slim-bullseye - Pip upgraded from 25.0.1 to 26.1.1 during the step (shows "Successfully uninstalled pip-25.0.1" and "Successfully installed pip-26.1.1"). The failure is due to a missing README, not a clear version mismatch, but it occurs in the context of building package metadata with Poetry/Pyproject tooling.
# Docker build ignore file # Ignore version control and build artefacts .git __pycache__/ *.pyc *.pyo *.pyd *.swap *.bak *.tmp venv/ venv*/ .venv/ .venv*/ dist/ build/ egG info/ *.egg-info/ .eggs .coverage .coverage.* .cache .mypy_cache/ .results/ .tox/ .tox/ *.log .tests/ tests/ # Include docs and sources for wheel packaging # (do not ignore docs to ensure long_description can be read) docs/ node_modules/ *.sqlite3 *.sqlite3-journal
""" Sherlock Module
This module contains the main logic to search for usernames at social
networks.
"""
from importlib.metadata import version as pkg_version, PackageNotFoundError
import pathlib
import tomli
def get_version() -> str:
"""Fetch the version number of the installed package."""
try:
return pkg_version("sherlock_project")
except PackageNotFoundError:
pyproject_path: pathlib.Path = pathlib.Path(__file__).resolve().parent.parent / "pyproject.toml"
with pyproject_path.open("rb") as f:
pyproject_data = tomli.load(f)
return pyproject_data["tool"]["poetry"]["version"]
# This variable is only used to check for ImportErrors induced by users running as script rather than as module or package
import_error_test_var = None
__shortname__ = "Sherlock"
__longname__ = "Sherlock: Find Usernames Across Social Networks"
__version__ = get_version()
forge_api_latest_release = "https://api.github.com/repos/sherlock-project/sherlock/releases/latest"
- Failing step: [6/6] RUN python -m pip install --no-cache-dir . - Exit code: 1 - Exact error message and context: - error: subprocess-exited-with-error - metadata-generation-failed - × Encountered error while generating package metadata. - ╰─> from file:///sherlock - FileNotFoundError: [Errno 2] No such file or directory: '/sherlock/docs/pyproject/README.md' - The above exception was the direct cause of the following exception: - FileNotFoundError: Readme path `/sherlock/docs/pyproject/README.md` does not exist. - note: This error originates from a subprocess, and is likely not a problem with pip. - Missing packages/files mentioned: - Missing file: /sherlock/docs/pyproject/README.md - Version mismatch info: - No explicit version mismatch reported. Base image in use: python:3.12-slim-bullseye.
# Docker build ignore file # Ignore version control and build artefacts .git __pycache__/ *.pyc *.pyo *.pyd *.swap *.bak *.tmp venv/ venv*/ .venv/ .venv*/ dist/ build/ egG info/ *.egg-info/ .eggs .coverage .coverage.* .cache .mypy_cache/ .results/ .tox/ .tox/ *.log .tests/ tests/ # Do not ignore docs to ensure wheel packaging can read long_description # docs/ node_modules/ *.sqlite3 *.sqlite3-journal
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
# Ignore Python cache and build artifacts __pycache__/ *.pyc *.pyo *.pyd *.swp *.swo # Virtual environments venv/ env/ .env/ .venv/ # Local development .dockerignore Dockerfile *.log *.tmp **/__pycache__/ # Documentation and tests - avoid bloating the image docs/ tests/ *.md # Git .git/ *.git/
- Exact error message and exit code
- Exit code: 1
- error: metadata-generation-failed
- The failing sub-step shows: “Preparing metadata (pyproject.toml): finished with status 'error'” followed by:
- FileNotFoundError: [Errno 2] No such file or directory: '/sherlock/docs/pyproject/README.md'
- FileNotFoundError: Readme path `/sherlock/docs/pyproject/README.md` does not exist.
- Failing command/step
- Failing command: RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel && python -m pip install --no-cache-dir .
- Missing packages or files mentioned
- Missing file: /sherlock/docs/pyproject/README.md (Readme path does not exist)
- Version mismatch info
- No explicit version mismatch is shown in the log. The failure is due to a missing README file required for metadata generation during the wheel build.# Ignore Python cache and build artifacts __pycache__/ *.pyc *.pyo *.pyd *.swp *.swo # Virtual environments venv/ env/ .env/ .venv/ # Local development .dockerignore Dockerfile *.log *.tmp **/__pycache__/ # Git .git/ *.git/
# Ignore Python cache and build artifacts __pycache__/ *.pyc *.pyo *.pyd *.swp *.swo # Virtual environments venv/ env/ .env/ .venv/ # Local development .dockerignore Dockerfile *.log *.tmp **/__pycache__/ # Git .git/ *.git/
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
# Ignore Python cache and build artifacts __pycache__/ *.pyc *.pyo *.pyd *.swp *.swo # Virtual environments venv/ env/ .env/ .venv/ # Local development .dockerignore Dockerfile *.log *.tmp **/__pycache__/ # Git .git/ *.git/
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
Concerns: Smoke tests may rely on network access to fetch results from remote sites (Sherlock searches). In restricted CI environments, this could cause false negatives., If the repository does not include a non-networking smoke script (e.g., smoke.sh) or an example health script, the first smoke command may fail. Consider including a lightweight smoke script or a built-in non-network smoke check. Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c 'if [ -x ./smoke.sh ]; then ./smoke.sh; else echo NO_SMOKE_SCRIPT; exit 1; fi Output: sh: 1: set: Illegal option -o pipefail Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c 'sherlock github 2>&1 | head -n 20 | grep -qi https:// Output: sh: 1: set: Illegal option -o pipefail
#!/bin/sh
set -e
# Lightweight smoke test: ensure the sherlock CLI is available and prints help
if command -v sherlock >/dev/null 2>&1; then
sherlock --help >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "SMOKE_OK"
exit 0
else
echo "SMOKE_FAIL: sherlock --help exit code != 0" >&2
exit 1
fi
else
echo "SMOKE_FAIL: sherlock command not found in PATH" >&2
exit 1
fi
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
Concerns: VERSION_TAG defaults to 0.0.0 and VCS_REF defaults to unknown; these should be updated to the actual release version and full commit hash before publishing., The final image relies on building from source and installing via pip; ensure all runtime dependencies are properly captured and pinned to avoid reproducibility issues., COPY . . in the builder stage pulls the entire repo (including tests or large files) into the build context; consider a more selective COPY to reduce image size and potential security exposure. Smoke [FAIL]: docker run --rm --entrypoint "" <image> sh -c "set -e; sherlock elonmusk | grep -E -q 'https?://'; echo TEST_PASSED Output: sh: 1: set: Illegal option -o pipefail
#!/usr/bin/env bash set -euo pipefail # Lightweight smoke test: ensure the sherlock CLI is available and prints help if ! command -v sherlock >/dev/null 2>&1; then echo "SMOKE_FAIL: sherlock command not found in PATH" >&2 exit 1 fi if ! sherlock --help >/dev/null 2>&1; then echo "SMOKE_FAIL: sherlock --help exit code != 0" >&2 exit 1 fi echo "SMOKE_OK"
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c "python -c 'import sherlock, re; v = getattr(sherlock, \"__version__\", \"\"); assert isinstance(v, str) and len(v) > 0; print(\"VER_OK\") Output: sh: 1: set: Illegal option -o pipefail Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c "python -c 'import sherlock; v = getattr(sherlock, \"__version__\", \"\"); print(len(v)); assert len(v) > 0; print(\"OK_LEN\") Output: sh: 1: set: Illegal option -o pipefail Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c "python -c 'import inspect, sherlock; fns = [name for name, obj in inspect.getmembers(sherlock) if callable(obj)]; assert len(fns) > 0; print(\"CALLABLE_OK\") Output: sh: 1: set: Illegal option -o pipefail
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# If the docs/pyproject/README.md file is missing, create a placeholder to satisfy metadata reads
RUN [ -f docs/pyproject/README.md ] || (mkdir -p docs/pyproject && echo "Sherlock project" > docs/pyproject/README.md)
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
Concerns: Relies on sherlock.__version__ existing; if the package does not expose __version__, the first smoke test will fail., Second test invokes the CLI for a version string; runtime behavior may vary if packaging changes how version is emitted.
Smoke [FAIL]: python -c 'import sherlock; v = getattr(sherlock, "__version__", None); assert isinstance(v, str) and len(v) > 0; print("ok")
Output: sh: 1: set: Illegal option -o pipefail
Smoke [FAIL]: sherlock --version | grep -q '[0-9]
Output: sh: 1: set: Illegal option -o pipefail#!/bin/sh set -e # Lightweight smoke test: ensure the sherlock CLI is available and prints help if sherlock --help >/dev/null 2>&1; then echo "SMOKE_OK" exit 0 else echo "SMOKE_FAIL: sherlock --help failed or not found" >&2 exit 1 fi
Concerns: The Dockerfile uses a default VERSION_TAG of 0.0.0; ensure this is updated to the actual version in sherlock/__init__.py before publishing., No HEALTHCHECK instruction in the final image; adding one could help in orchestration environments., Smoke tests may rely on network access if the CLI performs remote checks; prefer tests that validate packaging/loading without external calls.
Smoke [FAIL]: python -c 'import sherlock; v = getattr(sherlock, "__version__", ""); assert isinstance(v, str) and len(v) > 0; print("VER_OK:"+v)
Output: sh: 1: set: Illegal option -o pipefail
Smoke [FAIL]: python -c 'import sherlock, sherlock.__main__ as main; print("MAIN_LOADED")
Output: sh: 1: set: Illegal option -o pipefail#!/bin/sh set -e # Lightweight smoke test: ensure the sherlock CLI is available and prints help if sherlock --help >/dev/null 2>&1; then echo "SMOKE_OK" exit 0 else echo "SMOKE_FAIL: sherlock --help failed or not found" >&2 exit 1 fi
""" Sherlock Module
This module contains the main logic to search for usernames at social
networks.
"""
from importlib.metadata import version as pkg_version, PackageNotFoundError
import pathlib
import tomli
def get_version() -> str:
"""Fetch the version number of the installed package."""
try:
return pkg_version("sherlock_project")
except PackageNotFoundError:
pyproject_path: pathlib.Path = pathlib.Path(__file__).resolve().parent.parent / "pyproject.toml"
with pyproject_path.open("rb") as f:
pyproject_data = tomli.load(f)
return pyproject_data["tool"]["poetry"]["version"]
# This variable is only used to check for ImportErrors induced by users running as script rather than as module or package
import_error_test_var = None
__shortname__ = "Sherlock"
__longname__ = "Sherlock: Find Usernames Across Social Networks"
__version__ = get_version()
forge_api_latest_release = "https://api.github.com/repos/sherlock-project/sherlock/releases/latest"
# Ignore Python cache and build artifacts __pycache__/ *.pyc *.pyo *.pyd *.swp *.swo # Virtual environments venv/ env/ .env/ .venv/ # Local development .dockerignore Dockerfile *.log *.tmp **/__pycache__/ # Git .git/ *.git/
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# If the docs/pyproject/README.md file is missing, create a placeholder to satisfy metadata reads
RUN [ -f docs/pyproject/README.md ] || (mkdir -p docs/pyproject && echo "Sherlock project" > docs/pyproject/README.md)
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
ENTRYPOINT ["sherlock"]
CMD ["--help"]
Concerns: Smoke tests do not exercise networked functionality (which Sherlock's CLI relies on). Consider adding an offline smoke path or a README/existing example that can run without external network access, if possible.
Smoke [FAIL]: python -c 'import sherlock; v = getattr(sherlock, "__version__", None); assert isinstance(v, str) and len(v) > 0; print("VERSION_OK", v)
Output: sh: 1: set: Illegal option -o pipefail
Smoke [FAIL]: python -c 'import sherlock, importlib.metadata as m; ver = m.version("sherlock"); print("METADATA_VERSION_OK", ver); assert isinstance(ver, str) and ver == getattr(sherlock, "__version__", ver)
Output: sh: 1: set: Illegal option -o pipefail# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.0 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS builder
WORKDIR /sherlock
# Install basic build tools for Python packaging
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
# Copy the repository into the builder stage
COPY . .
# Ensure modern packaging tools are available in the builder environment
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel
# If the docs/pyproject/README.md file is missing, create a placeholder to satisfy metadata reads
RUN [ -f docs/pyproject/README.md ] || (mkdir -p docs/pyproject && echo "Sherlock project" > docs/pyproject/README.md)
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
ARG VERSION_TAG=0.0.0
ARG VCS_REF=unknown
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=${VCS_REF} \
org.label-schema.vcs-url=${VCS_URL} \
org.label-schema.name="Sherlock" \
org.label-schema.version=${VERSION_TAG} \
website="https://sherlockproject.xyz"
# Copy built source from the builder stage
COPY --from=builder /sherlock /sherlock
# Install the project from source so the CLI is available in PATH
RUN python -m pip install --no-cache-dir --upgrade pip setuptools wheel \
&& python -m pip install --no-cache-dir .
# Ensure the smoke test script is executable so the CI smoke harness can run it
RUN if [ -f /sherlock/smoke.sh ]; then chmod +x /sherlock/smoke.sh; fi
ENTRYPOINT ["sherlock"]
CMD ["--help"]
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.1 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS build
WORKDIR /sherlock
# Install build tooling for later (no network calls during test beyond the image build)
RUN pip3 install --no-cache-dir --upgrade pip
# Copy the repository for a local install in the final image
COPY . ./
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
# Build-time arguments for versioning and metadata
ARG VCS_REF=
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG=
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.name="Sherlock" \
org.label-schema.version=$VERSION_TAG \
website="https://sherlockproject.xyz"
# Install runtime requirements and the Sherlock CLI from local repo
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN python3 -m pip install --no-cache-dir --upgrade pip
# Copy the source from the build stage and install from source
COPY --from=build /sherlock /sherlock
RUN pip3 install --no-cache-dir .
# Default command: show help when run without args; allow --version via the CLI
ENTRYPOINT ["sherlock"]
CMD ["--help"]
# Basic healthcheck to ensure the CLI is functional in CI/offline environments
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD sherlock --help >/dev/null 2>&1 || exit 1
**/.git **/__pycache__ **/.pytest_cache__ **/*.pyc **/*.pyo **/*.pyd venv/ ENV/ env/ ENVIRON/ *.egg-info/ dist/ build/ *.egg *.whl *.tox/ *.venv/ *.log *.cache/ .coverage .coverage.* __pycache__/ tests/ .sdist/ *.tar.gz *.zip *.sqlite *.db *.bak *.swp *.swo *.DS_Store
Smoke [FAIL]: python3 -c "import sherlock; v = getattr(sherlock, '__version__', None); assert isinstance(v, str) and len(v) > 0; print(v) Output: sh: 1: set: Illegal option -o pipefail
""" Sherlock Module
This module contains the main logic to search for usernames at social
networks.
"""
from importlib.metadata import version as pkg_version, PackageNotFoundError
import pathlib
import tomli
def get_version() -> str:
"""Fetch the version number of the installed package."""
try:
return pkg_version("sherlock_project")
except PackageNotFoundError:
pyproject_path: pathlib.Path = pathlib.Path(__file__).resolve().parent.parent / "pyproject.toml"
with pyproject_path.open("rb") as f:
pyproject_data = tomli.load(f)
return pyproject_data["tool"]["poetry"]["version"]
# This variable is only used to check for ImportErrors induced by users running as script rather than as module or package
import_error_test_var = None
__shortname__ = "Sherlock"
__longname__ = "Sherlock: Find Usernames Across Social Networks"
__version__ = get_version()
forge_api_latest_release = "https://api.github.com/repos/sherlock-project/sherlock/releases/latest"
# Release instructions:
# 1. Update the version tag in the Dockerfile to match the version in sherlock/__init__.py
# 2. Update the VCS_REF tag to match the tagged version's FULL commit hash
# 3. Build image with BOTH latest and version tags
# i.e. `docker build -t sherlock/sherlock:0.16.1 -t sherlock/sherlock:latest .`
FROM python:3.12-slim-bullseye AS build
WORKDIR /sherlock
# Install build tooling for later (no network calls during test beyond the image build)
RUN pip3 install --no-cache-dir --upgrade pip
# Copy the repository for a local install in the final image
COPY . ./
FROM python:3.12-slim-bullseye
WORKDIR /sherlock
# Build-time arguments for versioning and metadata
ARG VCS_REF=
ARG VCS_URL="https://github.com/sherlock-project/sherlock"
ARG VERSION_TAG=
ENV SHERLOCK_ENV=docker
LABEL org.label-schema.vcs-ref=$VCS_REF \
org.label-schema.vcs-url=$VCS_URL \
org.label-schema.name="Sherlock" \
org.label-schema.version=$VERSION_TAG \
website="https://sherlockproject.xyz"
# Install runtime requirements and the Sherlock CLI from local repo
RUN apt-get update \
&& apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN python3 -m pip install --no-cache-dir --upgrade pip
# Copy the source from the build stage and install from source
COPY --from=build /sherlock /sherlock
RUN pip3 install --no-cache-dir .
# Ensure sh is Bash for compatibility with smoke tests
RUN ln -sf /bin/bash /bin/sh
# Default command: show help when run without args; allow --version via the CLI
ENTRYPOINT ["sherlock"]
CMD ["--help"]
# Basic healthcheck to ensure the CLI is functional in CI/offline environments
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD sherlock --help >/dev/null 2>&1 || exit 1
Concerns: Smoke tests rely on network access to external sites (Sherlock performs web scans); in offline CI environments these tests may fail even if the image is built correctly., Output format may vary with Sherlock versions or site responses; tests assume presence of https URLs in output which could change., The tests do not exercise a contained, offline path of the tool (e.g., a mock dataset) and thus may be brittle across environments. Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c 'sherlock alice 2>&1 | grep -q "https:// Output: sh: -c: line 2: unexpected EOF while looking for matching `'' Smoke [FAIL]: docker run --rm --entrypoint "" sherlock/sherlock:latest sh -c 'sherlock sherlock 2>&1 | grep -q "https:// Output: sh: -c: line 2: unexpected EOF while looking for matching `''