Skip to content

Starting and Stopping Docker Containers

This example will show how to start and stop a container for each worktree. Postgres is used to demonstrate, but it could be anything.

Start container in post_create

Use the branch name to create a unique container name and port. The port calculation is covered in more depth in Assigning a Unique Port.

CONTAINER_NAME="pg-$AUTOWT_BRANCH_NAME"
BASE_PORT=5432
PORT_RANGE=1000
HASH=$(echo "$AUTOWT_BRANCH_NAME" | md5sum | cut -c1-4)
OFFSET=$((16#$HASH % $PORT_RANGE))
PORT=$((BASE_PORT + OFFSET))

docker run -d \
  --name "$CONTAINER_NAME" \
  -e POSTGRES_PASSWORD=postgres \
  -p "$PORT:5432" \
  postgres:16

echo "DATABASE_URL=postgres://postgres:postgres@localhost:$PORT/postgres" >> .env

Stop container in pre_cleanup

CONTAINER_NAME="pg-$AUTOWT_BRANCH_NAME"
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true

Complete config

# .autowt.toml
[scripts]
post_create = """
CONTAINER_NAME="pg-$AUTOWT_BRANCH_NAME"
BASE_PORT=5432
PORT_RANGE=1000
HASH=$(echo "$AUTOWT_BRANCH_NAME" | md5sum | cut -c1-4)
OFFSET=$((16#$HASH % $PORT_RANGE))
PORT=$((BASE_PORT + OFFSET))

docker run -d \
  --name "$CONTAINER_NAME" \
  -e POSTGRES_PASSWORD=postgres \
  -p "$PORT:5432" \
  postgres:16

echo "DATABASE_URL=postgres://postgres:postgres@localhost:$PORT/postgres" >> .env
"""

pre_cleanup = """
CONTAINER_NAME="pg-$AUTOWT_BRANCH_NAME"
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
"""

Try it out

# Create worktree - container starts automatically
autowt my-feature

# Verify container is running
docker ps | grep pg-my-feature

# Connect to database
source .env
psql "$DATABASE_URL"

# Cleanup - container stops and removes
autowt cleanup my-feature

# Verify container is gone
docker ps -a | grep pg-my-feature  # should return nothing