# syntax=docker/dockerfile:1
FROM python:3.12-slim
# Basic environment variables used by the build
ENV CODE_DIR=/app \
DATA_DIR=/data \
VENV_DIR=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
UV_CACHE_DIR=/root/.cache/uv \
UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_PREFERENCE=only-system \
IN_DOCKER=True
# Global user configuration (matching the project defaults)
ENV BROWSERUSE_USER="browseruse" \
DEFAULT_PUID=911 \
DEFAULT_PGID=911
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
# Use a reasonably strict shell to fail early on errors
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "errtrace", "-o", "nounset", "-c"]
# Configure apt to be faster and less noisy
RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' > /etc/apt/apt.conf.d/99keep-cache \
&& echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/99no-intall-recommends \
&& echo 'APT::Install-Suggests "0";' > /etc/apt/apt.conf.d/99no-intall-suggests \
&& rm -f /etc/apt/apt.conf.d/docker-clean
# Install minimal system dependencies required for building and running
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
ca-certificates curl unzip gnupg2 fontconfig \
nano iputils-ping dnsutils jq \
&& rm -rf /var/lib/apt/lists/*
# Bring in uv (Astral's uv image) to provide the uv tool
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
# Only copy manifest first to leverage Docker build cache
COPY pyproject.toml uv.lock* /app/
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Setting up venv using uv in $VENV_DIR..." \
&& ( \
which uv && uv --version \
&& uv venv \
&& which python | grep "$VENV_DIR" \
&& python --version \
) | tee -a /VERSION.txt
# Install Chromium for Playwright/browser tests and font dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing chromium browser from system packages..." \
&& apt-get update -qq \
&& apt-get install -y --no-install-recommends \
chromium \
fonts-unifont \
fonts-liberation \
fonts-dejavu-core \
fonts-freefont-ttf \
fonts-noto-core \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/chromium /usr/bin/chromium-browser \
&& ln -s /usr/bin/chromium /app/chromium-browser \
&& mkdir -p "/home/${BROWSERUSE_USER}/.config/chromium/Crash Reports/pending/" \
&& groupadd --system $BROWSERUSE_USER \
&& useradd --system --create-home --gid $BROWSERUSE_USER --groups audio,video $BROWSERUSE_USER \
&& usermod -u "$DEFAULT_PUID" "$BROWSERUSE_USER" \
&& groupmod -g "$DEFAULT_PGID" "$BROWSERUSE_USER" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "/home/${BROWSERUSE_USER}/.config" \
&& ( which chromium-browser && /usr/bin/chromium-browser --version ) | tee -a /VERSION.txt
# Install browser-use python dependencies in a cached layer
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip sub-dependencies..." \
&& ( \
uv sync --all-extras --no-dev --no-install-project \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
# Copy the rest of the code and install browser-use from source
COPY . /app
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip library from source..." \
&& ( \
uv sync --all-extras --locked --no-dev \
&& python -c "import browser_use; print('browser-use installed successfully')" \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
RUN mkdir -p "$DATA_DIR/profiles/default" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "$DATA_DIR" "$DATA_DIR"/* \
&& ( \
echo -e "\n\n[√] Finished Docker build successfully. Saving build summary in: /VERSION.txt" \
&& echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" \
&& echo -e "BUILD_END_TIME=$(date +\"%Y-%m-%d %H:%M:%S %s\")\n\n" \
) | tee -a /VERSION.txt
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242
EXPOSE 9222
ENTRYPOINT ["browser-use"]
# Ignore git and node_modules and various artifacts .git node_modules __pycache__ *.pyc *.pyo *.egg-info .coverage dist build .env .env.* *.pytest_cache *.log *.sqlite3 *.db .envs __pycache__/ */.venv */venv .data .data/** .data*/**
Concerns: COPY pyproject.toml uv.lock* may fail at build time if uv.lock* does not exist in the build context; consider ensuring lock files are present or adjust COPY to tolerate missing lock files., There is a minor typo in apt config filenames (99no-intall-recommends, 99no-intall-suggests). While functional, correcting the typos would improve clarity.
Smoke [PASS]: which browser-use
Smoke [FAIL]: browser-use --version
Output: usage: browser-use [-h] [--headed] [--profile [PROFILE]] [--cdp-url CDP_URL]
[--connect] [--session SESSION] [--json] [--mcp]
[--template TEMPLATE]
{install,init,setup,doctor,open,click,type,input,scroll,back,screenshot,state,switch,close-tab,keys,select,upload,eval,extract,hover,dblclick,rightclick,cookies,wait,get,python,tunnel,close,sessions,cloud,profile}
...
browser-use: error: unrecognized arguments: --version
Smoke [PASS]: browser-use --help#!/usr/bin/env bash
set -euo pipefail
REAL_BIN="/usr/local/bin/browser-use.real"
if [ -f "$REAL_BIN" ]; then
: # real bin exists
else
if command -v browser-use.real >/dev/null 2>&1; then
REAL_BIN=$(command -v browser-use.real)
else
REAL_BIN="/usr/local/bin/browser-use"
fi
fi
# If no args are provided, show help via the real binary
if [ "$#" -eq 0 ]; then
exec "$REAL_BIN" "help"
fi
case "$1" in
--version)
# Attempt to print version from Python package if available
python - <<'PY'
import importlib
try:
m = importlib.import_module("browser_use")
print(getattr(m, "__version__", "unknown"))
except Exception:
print("unknown")
PY
;;
*)
exec "$REAL_BIN" "$@"
;;
esac
# syntax=docker/dockerfile:1
FROM python:3.12-slim
# Basic environment variables used by the build
ENV CODE_DIR=/app \
DATA_DIR=/data \
VENV_DIR=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
UV_CACHE_DIR=/root/.cache/uv \
UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_PREFERENCE=only-system \
IN_DOCKER=True
# Global user configuration (matching the project defaults)
ENV BROWSERUSE_USER="browseruse" \
DEFAULT_PUID=911 \
DEFAULT_PGID=911
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
# Use a reasonably strict shell to fail early on errors
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "errtrace", "-o", "nounset", "-c"]
# Configure apt to be faster and less noisy
RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' > /etc/apt/apt.conf.d/99keep-cache \
&& echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/99no-intall-recommends \
&& echo 'APT::Install-Suggests "0";' > /etc/apt/apt.conf.d/99no-intall-suggests \
&& rm -f /etc/apt/apt.conf.d/docker-clean
# Install minimal system dependencies required for building and running
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
ca-certificates curl unzip gnupg2 fontconfig \
nano iputils-ping dnsutils jq \
&& rm -rf /var/lib/apt/lists/*
# Bring in uv (Astral's uv image) to provide the uv tool
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
# Only copy manifest first to leverage Docker build cache
COPY pyproject.toml uv.lock* /app/
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Setting up venv using uv in $VENV_DIR..." \
&& ( \
which uv && uv --version \
&& uv venv \
&& which python | grep "$VENV_DIR" \
&& python --version \
) | tee -a /VERSION.txt
# Install Chromium for Playwright/browser tests and font dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing chromium browser from system packages..." \
&& apt-get update -qq \
&& apt-get install -y --no-install-recommends \
chromium \
fonts-unifont \
fonts-liberation \
fonts-dejavu-core \
fonts-freefont-ttf \
fonts-noto-core \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/chromium /usr/bin/chromium-browser \
&& ln -s /usr/bin/chromium /app/chromium-browser \
&& mkdir -p "/home/${BROWSERUSE_USER}/.config/chromium/Crash Reports/pending/" \
&& groupadd --system $BROWSERUSE_USER \
&& useradd --system --create-home --gid $BROWSERUSE_USER --groups audio,video $BROWSERUSE_USER \
&& usermod -u "$DEFAULT_PUID" "$BROWSERUSE_USER" \
&& groupmod -g "$DEFAULT_PGID" "$BROWSERUSE_USER" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "/home/${BROWSERUSE_USER}/.config" \
&& ( which chromium-browser && /usr/bin/chromium-browser --version ) | tee -a /VERSION.txt
# Install browser-use python dependencies in a cached layer
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip sub-dependencies..." \
&& ( \
uv sync --all-extras --no-dev --no-install-project \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
# Copy the rest of the code and install browser-use from source
COPY . /app
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip library from source..." \
&& ( \
uv sync --all-extras --locked --no-dev \
&& python -c "import browser_use; print('browser-use installed successfully')" \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
RUN mkdir -p "$DATA_DIR/profiles/default" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "$DATA_DIR" "$DATA_DIR"/* \
&& ( \
echo -e "\n\n[√] Finished Docker build successfully. Saving build summary in: /VERSION.txt" \
&& echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" \
&& echo -e "BUILD_END_TIME=$(date +\"%Y-%m-%d %H:%M:%S %s\")\n\n" \
) | tee -a /VERSION.txt
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242
EXPOSE 9222
ENTRYPOINT ["browser-use"]
# syntax=docker/dockerfile:1
FROM python:3.12-slim
# Basic environment variables used by the build
ENV CODE_DIR=/app \
DATA_DIR=/data \
VENV_DIR=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
UV_CACHE_DIR=/root/.cache/uv \
UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_PREFERENCE=only-system \
IN_DOCKER=True
# Global user configuration (matching the project defaults)
ENV BROWSERUSE_USER="browseruse" \
DEFAULT_PUID=911 \
DEFAULT_PGID=911
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
# Use a reasonably strict shell to fail early on errors
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "errtrace", "-o", "nounset", "-c"]
# Configure apt to be faster and less noisy
RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' > /etc/apt/apt.conf.d/99keep-cache \
&& echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/99no-install-recommends \
&& echo 'APT::Install-Suggests "0";' > /etc/apt/apt.conf.d/99no-install-suggests \
&& rm -f /etc/apt/apt.conf.d/docker-clean
# Install minimal system dependencies required for building and running
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
ca-certificates curl unzip gnupg2 fontconfig \
nano iputils-ping dnsutils jq \
&& rm -rf /var/lib/apt/lists/*
# Bring in uv (Astral's uv image) to provide the uv tool
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
# Only copy manifest first to leverage Docker build cache
COPY pyproject.toml /app/
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Setting up venv using uv in $VENV_DIR..." \
&& ( \
which uv && uv --version \
&& uv venv \
&& which python | grep "$VENV_DIR" \
&& python --version \
) | tee -a /VERSION.txt
# Install Chromium for Playwright/browser tests and font dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing chromium browser from system packages..." \
&& apt-get update -qq \
&& apt-get install -y --no-install-recommends \
chromium \
fonts-unifont \
fonts-liberation \
fonts-dejavu-core \
fonts-freefont-ttf \
fonts-noto-core \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/chromium /usr/bin/chromium-browser \
&& ln -s /usr/bin/chromium /app/chromium-browser \
&& mkdir -p "/home/${BROWSERUSE_USER}/.config/chromium/Crash Reports/pending/" \
&& groupadd --system $BROWSERUSE_USER \
&& useradd --system --create-home --gid $BROWSERUSE_USER --groups audio,video $BROWSERUSE_USER \
&& usermod -u "$DEFAULT_PUID" "$BROWSERUSE_USER" \
&& groupmod -g "$DEFAULT_PGID" "$BROWSERUSE_USER" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "/home/${BROWSERUSE_USER}/.config" \
&& ( which chromium-browser && /usr/bin/chromium-browser --version ) | tee -a /VERSION.txt
# Install browser-use python dependencies in a cached layer
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip sub-dependencies..." \
&& ( \
uv sync --all-extras --no-dev --no-install-project \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
# Copy the rest of the code and install browser-use from source
COPY . /app
# Copy wrapper for proper --version support and install it
COPY entrypoint-browser-use.sh /usr/local/bin/browser-use
RUN chmod +x /usr/local/bin/browser-use
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip library from source..." \
&& ( \
uv sync --all-extras --locked --no-dev \
&& python -c "import browser_use; print('browser-use installed successfully')" \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
RUN mkdir -p "$DATA_DIR/profiles/default" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "$DATA_DIR" "$DATA_DIR"/* \
&& ( \
echo -e "\n\n[√] Finished Docker build successfully. Saving build summary in: /VERSION.txt" \
&& echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" \
&& echo -e "BUILD_END_TIME=$(date +\"%Y-%m-%d %H:%M:%S %s\")\n\n" \
) | tee -a /VERSION.txt
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242
EXPOSE 9222
ENTRYPOINT ["browser-use"]
#!/usr/bin/env bash
set -euo pipefail
PY_MOD="browser_use.skill_cli.main"
print_version() {
python - << 'PY'
import importlib
try:
m = importlib.import_module("browser_use")
print(getattr(m, "__version__", "unknown"))
except Exception:
print("unknown")
PY
}
if [ "$#" -eq 0 ]; then
exec python -m "$PY_MOD" "help"
fi
case "$1" in
--version)
print_version
;;
*)
exec python -m "$PY_MOD" "$@"
;;
esac
No matches found.
# syntax=docker/dockerfile:1
FROM python:3.12-slim
# Basic environment variables used by the build
ENV CODE_DIR=/app \
DATA_DIR=/data \
VENV_DIR=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
UV_CACHE_DIR=/root/.cache/uv \
UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_PREFERENCE=only-system \
IN_DOCKER=True
# Global user configuration (matching the project defaults)
ENV BROWSERUSE_USER="browseruse" \
DEFAULT_PUID=911 \
DEFAULT_PGID=911
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
# Use a reasonably strict shell to fail early on errors
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "errtrace", "-o", "nounset", "-c"]
# Configure apt to be faster and less noisy
RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' > /etc/apt/apt.conf.d/99keep-cache \
&& echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/99no-install-recommends \
&& echo 'APT::Install-Suggests "0";' > /etc/apt/apt.conf.d/99no-install-suggests \
&& rm -f /etc/apt/apt.conf.d/docker-clean
# Install minimal system dependencies required for building and running
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
ca-certificates curl unzip gnupg2 fontconfig \
nano iputils-ping dnsutils jq \
&& rm -rf /var/lib/apt/lists/*
# Bring in uv (Astral's uv image) to provide the uv tool
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
# Only copy manifest first to leverage Docker build cache
COPY pyproject.toml uv.lock* /app/
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Setting up venv using uv in $VENV_DIR..." \
&& ( \
which uv && uv --version \
&& uv venv \
&& which python | grep "$VENV_DIR" \
&& python --version \
) | tee -a /VERSION.txt
# Install Chromium for Playwright/browser tests and font dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing chromium browser from system packages..." \
&& apt-get update -qq \
&& apt-get install -y --no-install-recommends \
chromium \
fonts-unifont \
fonts-liberation \
fonts-dejavu-core \
fonts-freefont-ttf \
fonts-noto-core \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/chromium /usr/bin/chromium-browser \
&& ln -s /usr/bin/chromium /app/chromium-browser \
&& mkdir -p "/home/${BROWSERUSE_USER}/.config/chromium/Crash Reports/pending/" \
&& groupadd --system $BROWSERUSE_USER \
&& useradd --system --create-home --gid $BROWSERUSE_USER --groups audio,video $BROWSERUSE_USER \
&& usermod -u "$DEFAULT_PUID" "$BROWSERUSE_USER" \
&& groupmod -g "$DEFAULT_PGID" "$BROWSERUSE_USER" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "/home/${BROWSERUSE_USER}/.config" \
&& ( which chromium-browser && /usr/bin/chromium-browser --version ) | tee -a /VERSION.txt
# Install browser-use python dependencies in a cached layer
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip sub-dependencies..." \
&& ( \
uv sync --all-extras --no-dev --no-install-project \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
# Copy the rest of the code and install browser-use from source
COPY . /app
# Copy wrapper for proper --version support and install it
COPY entrypoint-browser-use.sh /usr/local/bin/browser-use
RUN chmod +x /usr/local/bin/browser-use
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip library from source..." \
&& ( \
uv sync --all-extras --locked --no-dev \
&& python -c "import browser_use; print('browser-use installed successfully')" \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
RUN mkdir -p "$DATA_DIR/profiles/default" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "$DATA_DIR" "$DATA_DIR"/* \
&& ( \
echo -e "\n\n[√] Finished Docker build successfully. Saving build summary in: /VERSION.txt" \
&& echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" \
&& echo -e "BUILD_END_TIME=$(date +\"%Y-%m-%d %H:%M:%S %s\")\n\n" \
) | tee -a /VERSION.txt
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242
EXPOSE 9222
ENTRYPOINT ["browser-use"]
Dockerfile docker/base-images/system/Dockerfile docker/base-images/chromium/Dockerfile docker/base-images/python-deps/Dockerfile
Summary (under 1500 chars):
- Base image: python:3.12-slim
- Environment: CODE_DIR=/app, DATA_DIR=/data, VENV_DIR=/app/.venv, PATH=/app/.venv/bin:$PATH, UV_CACHE_DIR=/root/.cache/uv, UV_LINK_MODE=copy, UV_COMPILE_BYTECODE=1, UV_PYTHON_PREFERENCE=only-system, IN_DOCKER=True
- User config: BROWSERUSE_USER="browseruse", DEFAULT_PUID=911, DEFAULT_PGID=911
- Build args: TARGETPLATFORM, TARGETOS, TARGETARCH, TARGETVARIANT
- Shell: /bin/bash with pipefail, errexit, errtrace, nounset
- APT config: keep downloaded packages, disable install-recommends/suggests
- System deps installed: ca-certificates, curl, unzip, gnupg2, fontconfig, nano, iputils-ping, dnsutils, jq
- UV tool: copied from ghcr.io/astral-sh/uv:latest into /bin (via /uv and /uvx)
- Workdir: /app
- Initial copy: pyproject.toml and uv.lock* to /app
- Venv setup: uv venv; verify python path; python --version
- Chromium and fonts: install chromium and fonts-unifont/liberation/dejavu-core/freefont/noto-core; link chromium-browser; create /home/browseruse/.config/chromium/Crash Reports/pending/; create user browseruse with UID/GID 911; chown; verify chromium-browser --version
- Python deps (browser-use): uv sync --all-extras --no-dev --no-install-project
- Source copy: copy rest of code to /app
- Entry point wrapper: copy entrypoint-browser-use.sh to /usr/local/bin/browser-use; chmod +x
- Install browser-use from source: uv sync --all-extras --locked --no-dev; python -c "import browser_use; print('browser-use installed successfully')"
- Data dir setup: mkdir -p "$DATA_DIR/profiles/default"; chown -R browseruse:browseruse "$DATA_DIR" and contents
- Build summary: /VERSION.txt contains PLATFORM, ARCH, BUILD_END_TIME
- Runtime config: USER browseruse; VOLUME "$DATA_DIR"; EXPOSE 9242, 9222
- Entrypoint: ["browser-use"]# syntax=docker/dockerfile:1
FROM python:3.12-slim
# Basic environment variables used by the build
ENV CODE_DIR=/app \
DATA_DIR=/data \
VENV_DIR=/app/.venv \
PATH="/app/.venv/bin:$PATH" \
UV_CACHE_DIR=/root/.cache/uv \
UV_LINK_MODE=copy \
UV_COMPILE_BYTECODE=1 \
UV_PYTHON_PREFERENCE=only-system \
IN_DOCKER=True
# Global user configuration (matching the project defaults)
ENV BROWSERUSE_USER="browseruse" \
DEFAULT_PUID=911 \
DEFAULT_PGID=911
ARG TARGETPLATFORM
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT
# Use a reasonably strict shell to fail early on errors
SHELL ["/bin/bash", "-o", "pipefail", "-o", "errexit", "-o", "errtrace", "-o", "nounset", "-c"]
# Configure apt to be faster and less noisy
RUN echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' > /etc/apt/apt.conf.d/99keep-cache \
&& echo 'APT::Install-Recommends "0";' > /etc/apt/apt.conf.d/99no-install-recommends \
&& echo 'APT::Install-Suggests "0";' > /etc/apt/apt.conf.d/99no-install-suggests \
&& rm -f /etc/apt/apt.conf.d/docker-clean
# Install minimal system dependencies required for building and running
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
apt-get update -qq \
&& apt-get install -y --no-install-recommends \
ca-certificates curl unzip gnupg2 fontconfig \
nano iputils-ping dnsutils jq \
&& rm -rf /var/lib/apt/lists/*
# Bring in uv (Astral's uv image) to provide the uv tool
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
WORKDIR /app
# Only copy manifest first to leverage Docker build cache
COPY pyproject.toml uv.lock* /app/
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Setting up venv using uv in $VENV_DIR..." \
&& ( \
which uv && uv --version \
&& uv venv \
&& which python | grep "$VENV_DIR" \
&& python --version \
) | tee -a /VERSION.txt
# Install Chromium for Playwright/browser tests and font dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked,id=apt-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing chromium browser from system packages..." \
&& apt-get update -qq \
&& apt-get install -y --no-install-recommends \
chromium \
fonts-unifont \
fonts-liberation \
fonts-dejavu-core \
fonts-freefont-ttf \
fonts-noto-core \
&& rm -rf /var/lib/apt/lists/* \
&& ln -s /usr/bin/chromium /usr/bin/chromium-browser \
&& ln -s /usr/bin/chromium /app/chromium-browser \
&& mkdir -p "/home/${BROWSERUSE_USER}/.config/chromium/Crash Reports/pending/" \
&& groupadd --system $BROWSERUSE_USER \
&& useradd --system --create-home --gid $BROWSERUSE_USER --groups audio,video $BROWSERUSE_USER \
&& usermod -u "$DEFAULT_PUID" "$BROWSERUSE_USER" \
&& groupmod -g "$DEFAULT_PGID" "$BROWSERUSE_USER" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "/home/${BROWSERUSE_USER}/.config" \
&& ( which chromium-browser && /usr/bin/chromium-browser --version ) | tee -a /VERSION.txt
# Install browser-use python dependencies in a cached layer
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip sub-dependencies..." \
&& ( \
uv sync --all-extras --no-dev --no-install-project \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
# Copy the rest of the code and install browser-use from source
COPY . /app
# Copy wrapper for proper --version support and install it
COPY entrypoint-browser-use.sh /usr/local/bin/browser-use
RUN chmod +x /usr/local/bin/browser-use
RUN --mount=type=cache,target=/root/.cache,sharing=locked,id=cache-$TARGETARCH$TARGETVARIANT \
echo "[+] Installing browser-use pip library from source..." \
&& ( \
uv sync --all-extras --locked --no-dev \
&& python -c "import browser_use; print('browser-use installed successfully')" \
&& echo -e '\n\n' \
) | tee -a /VERSION.txt
RUN mkdir -p "$DATA_DIR/profiles/default" \
&& chown -R $BROWSERUSE_USER:$BROWSERUSE_USER "$DATA_DIR" "$DATA_DIR"/* \
&& ( \
echo -e "\n\n[√] Finished Docker build successfully. Saving build summary in: /VERSION.txt" \
&& echo -e "PLATFORM=${TARGETPLATFORM} ARCH=$(uname -m) ($(uname -s) ${TARGETARCH} ${TARGETVARIANT})\n" \
&& echo -e "BUILD_END_TIME=$(date +\"%Y-%m-%d %H:%M:%S %s\")\n\n" \
) | tee -a /VERSION.txt
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242
EXPOSE 9222
ENTRYPOINT ["browser-use"]
Concerns: LLM review failed — building without review Smoke [PASS]: ls /app || ls /usr/src || echo 'checking root' && ls /