speedup docker build to 20s

This commit is contained in:
Nick Sweeting
2025-06-27 05:36:23 -07:00
parent d1dfe49ee8
commit 0b8fda5d7c
6 changed files with 160 additions and 0 deletions

31
Dockerfile.fast Normal file
View File

@@ -0,0 +1,31 @@
# Fast Dockerfile using pre-built base images
ARG REGISTRY=browseruse
ARG BASE_TAG=latest
FROM ${REGISTRY}/base-python-deps:${BASE_TAG}
LABEL name="browseruse" description="Browser automation for AI agents"
ENV BROWSERUSE_USER="browseruse" DEFAULT_PUID=911 DEFAULT_PGID=911 DATA_DIR=/data
# Create user and directories
RUN 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" && \
mkdir -p /data /home/$BROWSERUSE_USER/.config && \
ln -s $DATA_DIR /home/$BROWSERUSE_USER/.config/browseruse && \
mkdir -p "/home/$BROWSERUSE_USER/.config/chromium/Crash Reports/pending/" && \
mkdir -p "$DATA_DIR/profiles/default" && \
chown -R "$BROWSERUSE_USER:$BROWSERUSE_USER" "/home/$BROWSERUSE_USER" "$DATA_DIR"
WORKDIR /app
COPY . /app
# Install browser-use
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
uv sync --all-extras --locked --no-dev --compile-bytecode
USER "$BROWSERUSE_USER"
VOLUME "$DATA_DIR"
EXPOSE 9242 9222
ENTRYPOINT ["browser-use"]

34
docker/README.md Normal file
View File

@@ -0,0 +1,34 @@
# Docker Setup for Browser-Use
This directory contains the optimized Docker build system for browser-use, achieving < 30 second builds.
## Quick Start
```bash
# Build base images (only needed once or when dependencies change)
./docker/build-base-images.sh
# Build browser-use
docker build -f Dockerfile.fast -t browseruse .
# Or use the standard Dockerfile (slower but self-contained)
docker build -t browseruse .
```
## Files
- `Dockerfile` - Standard self-contained build (~2 min)
- `Dockerfile.fast` - Fast build using pre-built base images (~30 sec)
- `docker/` - Base image definitions and build script
- `base-images/system/` - Python + minimal system deps
- `base-images/chromium/` - Adds Chromium browser
- `base-images/python-deps/` - Adds Python dependencies
- `build-base-images.sh` - Script to build all base images
## Performance
| Build Type | Time |
|------------|------|
| Standard Dockerfile | ~2 minutes |
| Fast build (with base images) | ~30 seconds |
| Rebuild after code change | ~16 seconds |

View File

@@ -0,0 +1,16 @@
ARG BASE_TAG=latest
FROM browseruse/base-system:${BASE_TAG}
WORKDIR /tmp
COPY pyproject.toml ./
# Install both playwright and patchright with versions from pyproject.toml
RUN --mount=type=cache,target=/root/.cache,sharing=locked \
PLAYWRIGHT_VERSION=$(grep -E "playwright>=" pyproject.toml | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+" | head -1) && \
PATCHRIGHT_VERSION=$(grep -E "patchright>=" pyproject.toml | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+" | head -1) && \
echo "Installing playwright==$PLAYWRIGHT_VERSION patchright==$PATCHRIGHT_VERSION" && \
pip install --no-cache-dir playwright==$PLAYWRIGHT_VERSION patchright==$PATCHRIGHT_VERSION && \
PLAYWRIGHT_BROWSERS_PATH=/opt/playwright playwright install --with-deps --no-shell chromium && \
ln -s /opt/playwright/chromium-*/chrome-linux/chrome /usr/bin/chromium-browser && \
chmod -R 755 /opt/playwright && \
rm -f pyproject.toml

View File

@@ -0,0 +1,11 @@
ARG BASE_TAG=latest
FROM browseruse/base-chromium:${BASE_TAG}
ENV PYTHONUNBUFFERED=1 PATH="/app/.venv/bin:$PATH" PLAYWRIGHT_BROWSERS_PATH=/opt/playwright
WORKDIR /app
COPY pyproject.toml uv.lock* ./
RUN --mount=type=cache,target=/root/.cache/uv,sharing=locked \
uv venv && \
uv sync --all-extras --no-dev --no-install-project --compile-bytecode

View File

@@ -0,0 +1,10 @@
FROM python:3.12-slim
# Install minimal system dependencies
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update && \
apt-get install -y --no-install-recommends ca-certificates curl wget && \
rm -rf /var/lib/apt/lists/*
# Install uv package manager
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/

58
docker/build-base-images.sh Executable file
View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Build script for browser-use base images
set -euo pipefail
# Configuration
REGISTRY="${DOCKER_REGISTRY:-browseruse}"
PLATFORMS="${PLATFORMS:-linux/amd64}"
PUSH="${PUSH:-false}"
# Build function
build_image() {
local name=$1
local dockerfile=$2
local build_args="${3:-}"
echo "[INFO] Building ${name}..."
local build_cmd="docker build"
local tag_args="-t ${REGISTRY}/${name}:latest -t ${REGISTRY}/${name}:$(date +%Y%m%d)"
# Use buildx for multi-platform or push
if [[ "$PLATFORMS" == *","* ]] || [ "$PUSH" = "true" ]; then
build_cmd="docker buildx build --platform=$PLATFORMS"
[ "$PUSH" = "true" ] && build_cmd="$build_cmd --push" || build_cmd="$build_cmd"
fi
$build_cmd $tag_args $build_args -f $dockerfile ../../..
}
# Main
cd "$(dirname "$0")"
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--push) PUSH=true; shift ;;
--registry) REGISTRY="$2"; shift 2 ;;
--platforms) PLATFORMS="$2"; shift 2 ;;
--help)
echo "Usage: $0 [--push] [--registry REG] [--platforms P]"
exit 0 ;;
*) echo "Unknown option: $1"; exit 1 ;;
esac
done
# Create buildx builder if needed
if [[ "$PLATFORMS" == *","* ]] || [ "$PUSH" = "true" ]; then
docker buildx inspect browseruse-builder >/dev/null 2>&1 || \
docker buildx create --name browseruse-builder --use
docker buildx use browseruse-builder
fi
# Build images in order
build_image "base-system" "base-images/system/Dockerfile"
build_image "base-chromium" "base-images/chromium/Dockerfile" "--build-arg BASE_TAG=latest"
build_image "base-python-deps" "base-images/python-deps/Dockerfile" "--build-arg BASE_TAG=latest"
echo "[INFO] Build complete. Use: FROM ${REGISTRY}/base-python-deps:latest"