Skip to content

feat: Add base image details and Python version management guide #1114

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
"pages": [
"sandboxes/overview",
"sandboxes/setup-commands",
"sandboxes/base-image",
"sandboxes/editor",
"sandboxes/environment-variables",
"sandboxes/web-preview"
Expand Down
121 changes: 121 additions & 0 deletions docs/sandboxes/base-image.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
---
title: "Base Image"
sidebarTitle: "Base Image"
icon: "docker"
---

Codegen sandboxes are built on a custom Docker image that provides a comprehensive development environment. The base image includes:

- **Python 3.13** (via `ghcr.io/astral-sh/uv:python3.13-bookworm`)
- **Node.js 22.14.0** (managed via NVM)
- **Essential development tools**: git, curl, ripgrep, fd-find, gh (GitHub CLI)
- **Package managers**: uv, npm, yarn, pnpm
- **Editors**: nano, vim
- **System utilities**: tmux, supervisor, nginx

## Dockerfile

```dockerfile
ARG TARGETPLATFORM=linux/amd64
FROM --platform=$TARGETPLATFORM ghcr.io/astral-sh/uv:python3.13-bookworm

# Set environment variables to prevent interactive prompts during installation
ENV NVM_DIR=/usr/local/nvm \
NODE_VERSION=22.14.0 \
DEBIAN_FRONTEND=noninteractive \
NODE_OPTIONS="--max-old-space-size=8192" \
PYTHONUNBUFFERED=1 \
COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
PYTHONPATH="/usr/local/lib/python3.13/site-packages" \
IS_SANDBOX=True

ENV PATH=$NVM_DIR/versions/node/$NODE_VERSION/bin:/usr/local/nvm:/usr/local/bin:$PATH

ARG INVALIDATE_FILES_LAYER=1
# Copy configuration files and set permissions
COPY sshd_config /etc/ssh/sshd_config
COPY ssh_config /etc/ssh/ssh_config
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY start.sh /usr/local/bin/start.sh
COPY setup_ssh_user.sh /usr/local/bin/setup_ssh_user.sh
COPY setup_ssh_keys.sh /usr/local/bin/setup_ssh_keys.sh
COPY nginx.conf /etc/nginx/nginx.conf
COPY error.html /usr/share/nginx/html/error.html
COPY tmux_output_script.sh /usr/local/bin/tmux_output_script.sh

# Install dependencies and set up environment in a single layer
RUN apt-get update && apt-get install -y -o Dpkg::Options::="--force-confold" \
git \
curl \
fd-find \
gh \
lsof \
ripgrep \
openssh-server \
nginx-full \
fcgiwrap \
tmux \
nano \
vim \
supervisor \
netcat-openbsd \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p -m 755 /etc/apt/keyrings \
&& wget -nv -O- https://cli.github.com/packages/githubcli-archive-keyring.gpg | tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
&& chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
# Set up environment variables and save it to /etc/profile.d/nvm.sh
&& echo "export NVM_DIR=\"$NVM_DIR\"" >> /etc/profile.d/nvm.sh \
&& echo "[ -s \"$NVM_DIR/nvm.sh\" ] && \. \"$NVM_DIR/nvm.sh\"" >> /etc/profile.d/nvm.sh \
&& echo "export PATH=\"$NVM_DIR/versions/node/$NODE_VERSION/bin:\$PATH\"" >> /etc/profile.d/nvm.sh \
&& echo "export NVM_BIN=\"$NVM_DIR/versions/node/$NODE_VERSION/bin\"" >> /etc/profile.d/nvm.sh \
&& echo "export NODE_VERSION=\"$NODE_VERSION\"" >> /etc/profile.d/nvm.sh \
&& echo "export NODE_OPTIONS=\"--max-old-space-size=8192\"" >> /etc/profile.d/nvm.sh \
&& echo "export DEBIAN_FRONTEND=noninteractive" >> /etc/profile.d/nvm.sh \
&& echo "export PYTHONUNBUFFERED=1" >> /etc/profile.d/nvm.sh \
&& echo "export COREPACK_ENABLE_DOWNLOAD_PROMPT=0" >> /etc/profile.d/nvm.sh \
&& echo "export PYTHONPATH=\"/usr/local/lib/python3.13/site-packages\"" >> /etc/profile.d/nvm.sh \
&& echo "export IS_SANDBOX=true" >> /etc/profile.d/nvm.sh \
&& echo "export NPM_CONFIG_YES=true" >> /etc/profile.d/nvm.sh \
&& echo "export PIP_NO_INPUT=1" >> /etc/profile.d/nvm.sh \
&& echo "export YARN_ENABLE_IMMUTABLE_INSTALLS=false" >> /etc/profile.d/nvm.sh \
&& chmod +x /etc/profile.d/nvm.sh \
# Run the SSH setup script
&& /usr/local/bin/setup_ssh_user.sh \
# Install nvm, Node.js, and code-server
&& mkdir -p $NVM_DIR \
&& curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash \
&& . $NVM_DIR/nvm.sh \
&& nvm install $NODE_VERSION \
&& nvm use $NODE_VERSION \
&& npm install -g yarn pnpm \
&& corepack enable \
&& corepack prepare yarn@stable --activate \
&& corepack prepare pnpm@latest --activate \
&& curl -fsSL https://raw.githubusercontent.com/coder/code-server/refs/tags/v4.99.1/install.sh | sh \
&& uv tool install uvicorn[standard]

ENTRYPOINT ["/usr/local/bin/start.sh"]
```

## Key Features

### Multi-Language Support
The base image supports both Python and Node.js development out of the box, making it suitable for full-stack applications and polyglot projects.

### Development Tools
Essential development tools are pre-installed, including:
- **Git** for version control
- **GitHub CLI** for GitHub integration
- **ripgrep** and **fd-find** for fast file searching
- **tmux** for terminal multiplexing
- **nginx** for web server capabilities

### Package Managers
Multiple package managers are available:
- **uv** for Python package management
- **npm**, **yarn**, and **pnpm** for Node.js packages
- **corepack** for managing package manager versions

### SSH and Remote Access
The image includes SSH server configuration for remote access and development, with proper user setup and key management.
82 changes: 80 additions & 2 deletions docs/sandboxes/setup-commands.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,17 @@ Codegen lets you configure custom setup commands that run once when initializing
`npm install`
</Tip>

## Base Image

Codegen sandboxes are built on a custom Docker image that provides a comprehensive development environment. For detailed information about the base image, including the complete Dockerfile and available tools, see the [Base Image](/sandboxes/base-image) documentation.

## Accessing Setup Commands

To configure setup commands for a repository:

1. Navigate to [codegen.com/repos](https://codegen.com/repos).
2. Click on the desired repository from the list.
3. You will be taken to the repository's settings page. The setup commands can be found at a URL similar to `https://codegen.com/{your_org}/{repo_name}/settings/setup-commands` (the exact URL structure might vary slightly, look for a "Setup Commands" or "Sandbox Configuration" section).
3. You will be taken to the repository's settings page. The setup commands can be found at a URL similar to `https://www.codegen.com/repos/{arepo_name}/setup-commands`

<Frame caption="Set setup commands at codegen.com/repos">
<img src="/images/setup-commands-ui.png" alt="Setup Commands UI" />
Expand Down Expand Up @@ -48,7 +52,11 @@ npm install
```

```bash
# Install Python dependencies
# Setup with specific Python version for compatibility
pyenv install 3.12.0
pyenv local 3.12.0
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

Expand All @@ -59,6 +67,75 @@ npm ci
npm run build
```

### Working with Different Python Versions

The sandbox comes with Python 3.13 by default, but some packages may not yet be compatible with this version. Here are strategies for handling different Python versions:

#### Using pyenv for Multiple Python Versions

If you need to work with a different Python version, you can install and use `pyenv`:

```bash
# Install pyenv
curl https://pyenv.run | bash

# Add pyenv to PATH (for current session)
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# Install Python 3.12 (or your desired version)
pyenv install 3.12.0

# Set Python 3.12 as the local version for your project
pyenv local 3.12.0

# Create a virtual environment with Python 3.12
python -m venv venv
source venv/bin/activate

# Install your dependencies
pip install -r requirements.txt
```

#### Using uv with Specific Python Versions

The `uv` package manager (already installed) can also manage Python versions:

```bash
# Install Python 3.12 and create a virtual environment
uv venv --python=3.12

# Activate the virtual environment
source .venv/bin/activate

# Install dependencies
uv pip install -r requirements.txt --refresh --upgrade
```

#### Virtual Environment Best Practices

When working with packages that require older Python versions:

```bash
# Create a virtual environment with a specific Python version
python3.12 -m venv venv_312
source venv_312/bin/activate

# Verify the Python version
python --version

# Install packages that require Python 3.12
pip install argis==2.4.0 # Example package that needs older Python

# Deactivate when done
deactivate
```

<Warning>
Remember to activate your virtual environment in your setup commands if you need specific Python versions for your project dependencies.
</Warning>

<Note>
Ensure your setup commands are non-interactive and can run to completion
without user input.
Expand All @@ -67,3 +144,4 @@ npm run build
The environment variables listed in the "Env Variables" section are available
during the execution of these setup commands.
</Tip>

Loading